标题: [文本处理] 批处理删除多个txt中的不同数字组合 [打印本页]
作者: lzyecho 时间: 2014-1-15 15:39 标题: 批处理删除多个txt中的不同数字组合
网上下载了多个页面文章内容,转换成txt后,内容里出现了多组类似 〹 、𘇍 的特殊符号与数字的组合(数字组合不同但长度相同),本人试了多次没成功,有时把整行都删除了。
请求删除的方法。先谢了。 (另外不同长度的数字与字母组合怎样删除但不影响行内的其它内容?再谢。)
作者: 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 编辑
- sed -r "s/&#[0-9]+;//g" a.txt>b.txt
复制代码
作者: xxpinqz 时间: 2014-1-15 21:47
sed好简单啊,纯p的好麻烦.- @echo off&setlocal enabledelayedexpansion
- set hh=^
-
-
- (for /f "delims=" %%a in (a.txt) do (
- set "tmp=%%a"
- for %%b in ("!hh!") do echo,!tmp:^&#=%%~b!
- echo ##
- ))>tmp
- (for /f "tokens=1* delims=;" %%a in (tmp) do (
- if not "%%a"=="##" (
- if "%%b"=="" (set/p =%%a) else set/p =%%b
- ) else echo,&echo,
- ))<nul>b.txt
- del tmp
- 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 - @echo off&setlocal enabledelayedexpansion
- set hh=^ rem 将转义字符^赋予变量hh
-
-
- (for /f "delims=" %%a in (a.txt) do ( rem 对a.txt进行文件解析,同时排除空格为分隔符
- set "tmp=%%a" rem 将a.txt中每行的内容赋予临时变量tmp
- for %%b in ("!hh!") do echo,!tmp:^&#=%%~b! rem将a.txt中每行的&#替代为^
- echo ## rem 在a.txt中的每一行下面加##
- ))>tmp rem 将上面处理好的结果输出到临时文件TMP中
- (for /f "tokens=1* delims=;" %%a in (tmp) do ( rem 对临时文件TMP进行文件解析,以;为分隔符,提取第一节及第二节后面的所有内容
- if not "%%a"=="##" ( rem 排除含有##的行不处理
- if "%%b"=="" (set/p =%%a) else set/p =%%b rem 判断第二节后面的内容是否为空,为空则输出第一节内容,否则输出第一节及第二节后面的所有内容
- ) else echo,&echo, rem 输出两回车
- ))<nul>b.txt rem 将处理好的文件输出到b.txt。 这里的<nul的作用可能是同行输出内容吧,不太清楚?同求解!
- del tmp rem 删除临时文件
- 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自带)也简单的- 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 |