[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

假设有一个包含如下内容的文本文件"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 编辑 ]

1.有...我不会...
2.setlocal后!被转义
3.用第三方
OrzDEF

TOP

  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 编辑 ]
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

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

TOP

回复 3楼 的帖子

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

4楼,“sed”在哪儿下?有源代码吗?

TOP

提点效率,修正下代码

  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
复制代码
***共同提高***

TOP

回复 5楼 的帖子

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

返回列表