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

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

[复制链接]
发表于 2010-7-1 19:08:01 | 显示全部楼层 |阅读模式
假设有一个包含如下内容的文本文件"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 编辑 ]
发表于 2010-7-1 19:33:52 | 显示全部楼层
1.有...我不会...
2.setlocal后!被转义
3.用第三方
发表于 2010-7-1 19:41:40 | 显示全部楼层
  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 编辑 ]
发表于 2010-7-1 21:20:35 | 显示全部楼层
  1. sed "s/Test.*TextD/Test7.0TextD/" 1.txt >2.txt
复制代码
 楼主| 发表于 2010-7-2 08:29:06 | 显示全部楼层

回复 3楼 的帖子

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

4楼,“sed”在哪儿下?有源代码吗?
发表于 2010-7-2 11:07:13 | 显示全部楼层

提点效率,修正下代码

  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
复制代码
发表于 2010-7-2 12:01:36 | 显示全部楼层

回复 5楼 的帖子

发表于 2016-4-1 15:24:55 | 显示全部楼层
楼主,如何能把空行留下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 03:07 , Processed in 0.019187 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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