Board logo

标题: [文本处理] 批处理删除多个txt中的不同数字组合 [打印本页]

作者: lzyecho    时间: 2014-1-15 15:39     标题: 批处理删除多个txt中的不同数字组合

网上下载了多个页面文章内容,转换成txt后,内容里出现了多组类似 &#12345  、&#98765 的特殊符号与数字的组合(数字组合不同但长度相同),本人试了多次没成功,有时把整行都删除了。
请求删除的方法。先谢了。 (另外不同长度的数字与字母组合怎样删除但不影响行内的其它内容?再谢。)
作者: battab    时间: 2014-1-15 16:53

回复 1# lzyecho

能不能传一部分TXT文档的内容上来看看?
作者: lzyecho    时间: 2014-1-15 17:14

回复 2# battab


    请参见附件。
作者: apang    时间: 2014-1-15 19:50

本帖最后由 apang 于 2014-1-15 20:35 编辑
  1. sed -r "s/&#[0-9]+;//g" a.txt>b.txt
复制代码

作者: xxpinqz    时间: 2014-1-15 21:47

sed好简单啊,纯p的好麻烦.
  1. @echo off&setlocal enabledelayedexpansion
  2. set hh=^
  3. (for /f "delims=" %%a in (a.txt) do (
  4.         set "tmp=%%a"
  5.         for %%b in ("!hh!") do echo,!tmp:^&#=%%~b!
  6.         echo ##
  7. ))>tmp
  8. (for /f "tokens=1* delims=;" %%a in (tmp) do (
  9.     if not "%%a"=="##" (
  10.         if "%%b"=="" (set/p =%%a) else set/p =%%b
  11.     ) else echo,&echo,
  12. ))<nul>b.txt
  13. del tmp
  14. start b.txt
复制代码

作者: lzyecho    时间: 2014-1-15 22:52

本帖最后由 lzyecho 于 2014-1-15 23:06 编辑

回复 5# xxpinqz


    感谢apang 和 xxpinqz ,你们太厉害了,高手啊。你们的代码都能很好的达到目的 ,真是感谢!!
apang 用的sed 精练、简短,看来以后还得学习sed了。

xxpinqz 你把批处理玩的精深,。因代码嵌套的多,较多地方看不大懂,希望能逐名解说一下。我还处在学习认识的阶段,继续向大家学习。
作者: battab    时间: 2014-1-16 09:42

本帖最后由 battab 于 2014-1-16 10:05 编辑

回复 6# lzyecho
  1. @echo off&setlocal enabledelayedexpansion
  2. set hh=^  rem 将转义字符^赋予变量hh
  3. (for /f "delims=" %%a in (a.txt) do (  rem 对a.txt进行文件解析,同时排除空格为分隔符
  4.         set "tmp=%%a"   rem 将a.txt中每行的内容赋予临时变量tmp
  5.         for %%b in ("!hh!") do echo,!tmp:^&#=%%~b!  rem将a.txt中每行的&#替代为^
  6.         echo ##    rem 在a.txt中的每一行下面加##
  7. ))>tmp  rem 将上面处理好的结果输出到临时文件TMP中
  8. (for /f "tokens=1* delims=;" %%a in (tmp) do (  rem 对临时文件TMP进行文件解析,以;为分隔符,提取第一节及第二节后面的所有内容
  9.     if not "%%a"=="##" (  rem 排除含有##的行不处理
  10.         if "%%b"=="" (set/p =%%a) else set/p =%%b  rem 判断第二节后面的内容是否为空,为空则输出第一节内容,否则输出第一节及第二节后面的所有内容
  11.     ) else echo,&echo,  rem 输出两回车
  12. ))<nul>b.txt  rem 将处理好的文件输出到b.txt。 这里的<nul的作用可能是同行输出内容吧,不太清楚?同求解!
  13. del tmp  rem 删除临时文件
  14. start b.txt rem 打开处理好的文档
复制代码
初学者试解读,有不对的地方还请各位前辈指教。
作者: terse    时间: 2014-1-16 13:31

纠正这里
rem 将转义字符^赋予变量hh
这里hh值应该是回车
作者: lzyecho    时间: 2014-1-16 14:04

回复 8# terse


    感谢battab的详尽解说,有多些地方茅塞顿开了。
<nul>b.txt   的含义是将结果以一行的形式输出,即“回车不换行”。
terse 说的代码 set hh=^  rem 将转义字符^赋予“回车hh”,不太明白它的意义??

echo,!tmp:^&#=%%~b! 替换代码中的%%~b的意思是?? 再请说明 ,谢啦。
作者: terse    时间: 2014-1-16 14:24

回复 9# lzyecho
这里 %%~b 是回车 换行
作者: terse    时间: 2014-1-16 14:34

另 楼主如有安装POWERSHELL (win7自带)也简单的
  1. Get-Content $pwd\a.txt | % {$_ -Replace '&#\d+',''} | out-file b.txt
复制代码

作者: BHsolve    时间: 2014-1-16 16:28

回复 8# terse


    你是说^在这里做回车符只用吗?
这样上面代码确实可以解释了,但是输出的  tmp文本  是这个样的
高中学习阶段,12345;你一定在班集体里度过了美好的时光,收获了深厚的情谊65489;,同窗共读,互相帮助,彼此激励,即便是一次不愉快的争执,都给你留下难忘的记忆,伴你走向成熟。
##
某机构就45812;“同学关系”问题在几所学校作了一次调查。362514;结果显示,60%的人表示满意,36%的人认为一般,4%的人觉得不满意。
##

怎么解释?
作者: terse    时间: 2014-1-16 16:54

回复 12# BHsolve
这里有个确实是替换了 只是你看不到
你可以在CMD里 TYPE 就看到结果 或者 FOR 遍历都可显示
这里\R\N 和 \N 是有区别的
其实这时的TMP文本替换进来的只有回车(0A)没有换行 (0D)
作者: BHsolve    时间: 2014-1-16 17:39

回复 13# terse


    原来如此,学习了,学习了。
作者: lzyecho    时间: 2014-1-16 21:02

回复 7# battab


    xxpinqz ,你好,在你解释的代码中还是不明白:
1.上面代码的第2、3、4行的意思是把^(下面还有两个空行或两个回车)定义给变量hh,为什么要是2个回车?

2. 为什么要 echo ##,起什么作用?而下面的if not "%%a"=="##" 又是不处理这些含##的行??
3.切分行的第二内容为“空”( if "%%b"==""  )意思?不为“空”时又是什么意思?

也就说作者的设计编程思路不明白。
烦请你结合上面附件的a.txt说明一下,谢。
作者: xxpinqz    时间: 2014-1-17 07:56

本帖最后由 xxpinqz 于 2014-1-17 08:04 编辑

回复 15# lzyecho
大概就7楼那位的解释。
获取换行符号需要转义,所以用^加两空行来定义,你记住这写法就行了。

第一个FOR语句是为了替换你文本中的&#符号为换行符,(不过这里要注意,虽然实际上已经替换了,但是直接输出的话还是一行,所以写入到临时文件tmp)

因为你源文本中一行可能包含多组&#符号,所以在每一行替换后,多输出一行##来区分,否则写入到TMP后你看不出你源文档哪行是哪行的。

第二个for,(这里写法也可用set直接把;之前替空),然后用##这个标志来区别临时文档TMP中的哪些行需要拼接成源文本的一行(意思就是碰到##,则之前的内容全输出为一行)

至于两个echo,则因为,一个用来对set/p 换行,一个是你源文件每行之间有空一行。

你要看清楚,则删除第15行代码del tmp  ,然后运行一遍后打开tmp这个文件对照看下就懂了。
作者: lzyecho    时间: 2014-1-17 12:43

回复 16# xxpinqz


    这就明白了,得多看,多揣摩体会。再谢xxpinqz的更细致解说。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2