找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 72132|回复: 16

[文本处理] 批处理删除多个txt中的不同数字组合

[复制链接]
发表于 2014-1-15 15:39:08 | 显示全部楼层 |阅读模式
网上下载了多个页面文章内容,转换成txt后,内容里出现了多组类似 &#12345  、&#98765 的特殊符号与数字的组合(数字组合不同但长度相同),本人试了多次没成功,有时把整行都删除了。
请求删除的方法。先谢了。 (另外不同长度的数字与字母组合怎样删除但不影响行内的其它内容?再谢。)
发表于 2014-1-15 16:53:08 | 显示全部楼层
回复 1# lzyecho

能不能传一部分TXT文档的内容上来看看?
 楼主| 发表于 2014-1-15 17:14:36 | 显示全部楼层
回复 2# battab


    请参见附件。
发表于 2014-1-15 19:50:24 | 显示全部楼层
本帖最后由 apang 于 2014-1-15 20:35 编辑
  1. sed -r "s/&#[0-9]+;//g" a.txt>b.txt
复制代码
发表于 2014-1-15 21:47:58 | 显示全部楼层
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
复制代码
 楼主| 发表于 2014-1-15 22:52:23 | 显示全部楼层
本帖最后由 lzyecho 于 2014-1-15 23:06 编辑

回复 5# xxpinqz


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

xxpinqz 你把批处理玩的精深,。因代码嵌套的多,较多地方看不大懂,希望能逐名解说一下。我还处在学习认识的阶段,继续向大家学习。
发表于 2014-1-16 09:42:57 | 显示全部楼层
本帖最后由 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 打开处理好的文档
复制代码
初学者试解读,有不对的地方还请各位前辈指教。
发表于 2014-1-16 13:31:04 | 显示全部楼层
纠正这里
rem 将转义字符^赋予变量hh
这里hh值应该是回车
 楼主| 发表于 2014-1-16 14:04:18 | 显示全部楼层
回复 8# terse


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

echo,!tmp:^&#=%%~b! 替换代码中的%%~b的意思是?? 再请说明 ,谢啦。
发表于 2014-1-16 14:24:26 | 显示全部楼层
回复 9# lzyecho
这里 %%~b 是回车 换行
发表于 2014-1-16 14:34:45 | 显示全部楼层
另 楼主如有安装POWERSHELL (win7自带)也简单的
  1. Get-Content $pwd\a.txt | % {$_ -Replace '&#\d+',''} | out-file b.txt
复制代码
发表于 2014-1-16 16:28:03 | 显示全部楼层
回复 8# terse


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

怎么解释?
发表于 2014-1-16 16:54:27 | 显示全部楼层
回复 12# BHsolve
这里有个确实是替换了 只是你看不到
你可以在CMD里 TYPE 就看到结果 或者 FOR 遍历都可显示
这里\R\N 和 \N 是有区别的
其实这时的TMP文本替换进来的只有回车(0A)没有换行 (0D)

评分

参与人数 1技术 +1 收起 理由
BHsolve + 1 只有回车(0A)没有换行 (0D)

查看全部评分

发表于 2014-1-16 17:39:24 | 显示全部楼层
回复 13# terse


    原来如此,学习了,学习了。
 楼主| 发表于 2014-1-16 21:02:24 | 显示全部楼层
回复 7# battab


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

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

也就说作者的设计编程思路不明白。
烦请你结合上面附件的a.txt说明一下,谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 01:06 , Processed in 0.036426 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表