Board logo

标题: [文本处理] 批处理如何实现通配符查找替换文本中指定字符串? [打印本页]

作者: kent    时间: 2010-7-1 19:08     标题: 批处理如何实现通配符查找替换文本中指定字符串?

假设有一个包含如下内容的文本文件"1.txt"
Line131TextA
     Line2561TextB
         Line3212TextC
         Test453TextD
     Line50725.76TextE
Line6TextF
         Test153TextD
         Test85.3TextD
Line7TextG

需求是: 在同时包含"Test"和"TextD"的行中,将"Test"和"TextD"之间的字符替换成固定的"7.0",生成"2.txt"
代码如下:
  1. @echo off
  2. (for /f "tokens=* delims=" %%a in (1.txt) do (
  3.     set "var=%%a"
  4.     setlocal enabledelayedexpansion
  5.     echo "!var!"|findstr "Test.*TextD">nul&& set "var=         Test7.0TextD"
  6.     echo !var!
  7.     endlocal
  8. )
  9. )>2.txt
  10. pause
复制代码
问题:
1、经实际测试,以上代码是可以实现基本功能的,可是为了使2.txt格式统一,set "var=         Test7.0TextD"中的空格数目是手动设定的,能否自动判断原文件中对应行前面的空格或者间隔符的个数,生成到2.txt中?
2、为什么"setlocal enabledelayedexpansion"必须在For语句内部执行?经反复验证,如果放在For语句外面的话,当1.txt中一些特殊符号的时候会被遗漏,比如感叹号"!",也就是说,如果1.txt中有感叹号的话,2.txt中就不会有。
3、以上代码执行时效率很低,能否有更好的方法?

[ 本帖最后由 kent 于 2010-7-2 10:35 编辑 ]
作者: Seter    时间: 2010-7-1 19:33

1.有...我不会...
2.setlocal后!被转义
3.用第三方
作者: x9tiancmd    时间: 2010-7-1 19:41

  1. @echo off
  2. (for /f "tokens=* delims=" %%a in (1.txt) do echo.%%a|find /i "Test" |find /i "TextD">nul&&echo. Test7.0TextD||echo.%%a)>2.txt
复制代码
复制粘贴板,再保存运行,这个就这样看显示好像从了两行, 其实就一行

echo. Test7.0TextD 换成  echo.+TAB键+Test7.0TextD
我这用PE 上的网,粘贴板忽视TAB键

[ 本帖最后由 x9tiancmd 于 2010-7-1 19:55 编辑 ]
作者: CUer    时间: 2010-7-1 21:20

  1. sed "s/Test.*TextD/Test7.0TextD/" 1.txt >2.txt
复制代码

作者: kent    时间: 2010-7-2 08:29     标题: 回复 3楼 的帖子

谢谢帮助。
用find效率会高一些吗?而且仍然没有解决自动判断原文件中对应行前面的空格或者间隔符的个数啊......

4楼,“sed”在哪儿下?有源代码吗?
作者: batman    时间: 2010-7-2 11:07     标题: 提点效率,修正下代码

  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     set "var=%%a"
  4.     setlocal enabledelayedexpansion
  5.     if "!var:Test=!" neq "!var!" if "!var:TextD=!" neq "!var!" set "var=         Test7.0TextD"
  6.     echo !var!
  7.     endlocal
  8. ))>2.txt
  9. start 2.txt
复制代码

作者: Batcher    时间: 2010-7-2 12:01     标题: 回复 5楼 的帖子

这里有下载地址:
http://bbs.bathome.net/thread-3981-1-1.html
作者: fatbird1942    时间: 2016-4-1 15:24

楼主,如何能把空行留下吗?




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