标题: [文本处理] [已解决]批处理如何替换含特殊字符的字符串? [打印本页]
作者: laoxiu 时间: 2009-7-22 20:29 标题: [已解决]批处理如何替换含特殊字符的字符串?
比如要把文本中的"鸡=7"替换成"鸡=七"
下面3段都是我尝试过的代码:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (a.txt) do (
- set var=%%a
- set change=!var:鸡^=7=鸡^=七!
- echo !change!
- )
- pause>nul
复制代码
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (a.txt) do (
- set var=%%a
- set change=!var:"鸡=7"="鸡=七"!
- echo !change!
- )
- pause>nul
复制代码
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (a.txt) do (
- set var=%%a
- set change=!var:"鸡^=7"="鸡^=七"!
- echo !change!
- )
- pause>nul
复制代码
第1段运行之后就是把鸡=7变成了7=鸡=七=7
第2,3段运行后文本没有内容变化
[ 本帖最后由 laoxiu 于 2009-8-22 21:05 编辑 ]
作者: keen 时间: 2009-7-22 20:54 标题: 回复 1楼 的帖子
请把问题描述的清楚一点,描述的多一些。
你的问题难道就是仅仅把数字7换成汉字七吗?
你的文本中就只有一行:鸡=7?
批处理是用来成批 处理问题。
作者: laoxiu 时间: 2009-7-22 20:58
是把"鸡=7"整个替换,文本其他地方出现的"7"不能替换
作者: laoxiu 时间: 2009-7-23 21:18
没人知道吗?高手来解答啊,试过引号和^都不行
作者: Batcher 时间: 2009-7-23 21:39
能否把你尝试过的代码贴到顶楼看看?
作者: Lumiere 时间: 2009-7-28 09:34 标题: 回复 4楼 的帖子
set命令不能直接将等号=替换为其它字符,但是可以将其它字符替换为等号=。以下为正确代码,生成的b.txt供理解上参考,c.txt为最终文件,将其改名为原始目标文件就号。- @echo off&setlocal enabledelayedexpansion
- call :replace
- for /f "delims=" %%a in (b.txt) do (
- set var=%%a
- set var=!var:鸡%char%7=鸡%char%七!&echo !var:%char%==!>>c.txt
- )
- pause&goto :eof 2>nul
- :replace
- set /p char=请输入一个文本中不包含的字符:
- find /i "%char%" a.txt>nul&&goto replace
- for /f "tokens=1* delims==" %%a in (a.txt) do (
- set temp=%%a%char%%%b
- call :loop
- )
- goto :eof 2>nul
- :loop
- for /f "tokens=1* delims==" %%m in ("!temp!") do (
- set temp=%%m%char%%%n
- if not "%%n"=="" (goto loop) else echo !temp:~0,-1!>>b.txt
- )
复制代码
PS:输入的时候不要输入批处理的某些特殊运算符,如^,!,%之类的,负责会出错,如果一定要输的话,那先将他们转义,比如^,&,&&,|等,但是!和%因为是变量组成部分,扩展以后会将命令语句的语法打乱,所以不能用,实在找不到文本中未出现的字符的话,也可以字符串,不过前提一定要尽可能是奇怪的长的组合,因为文本中比如有sdsd这样的字符串,而且此字串正好在=的前面,但是没有dsdd这样的字串,如果输入dsdd的话,虽然文本中没有,可以通过第一轮的findstr,但是两个字串连在一起的时候就变成了s dsdd sdd这样后来将原本的=号重新替换回来的时候将在第一个dsdd部分替换,而不是后来的sdsd dsdd,这样结果就变了,这样的情况需要在替换字符串以后再用findstr过滤一次。在此就不添加%,!还有替换字符串后重新过滤的代码了,因为比较好实现,自己琢磨吧。
[ 本帖最后由 Lumiere 于 2009-7-28 14:06 编辑 ]
作者: Batcher 时间: 2009-7-28 12:36
- @echo off
- mshta "javascript:var fso=new ActiveXObject('Scripting.FileSystemObject');fso.OpenTextFile('C:\\test\\b.txt',2,true).Write(fso.OpenTextFile('C:\\test\\a.txt').ReadAll().replace(/鸡=7/g, '鸡=七'));close()"
复制代码
作者: Batcher 时间: 2009-7-28 12:39
- sed -i "s/鸡=7/鸡=七/g" a.txt
复制代码
第三方命令行工具 sed.exe 下载地址:
http://bbs.bathome.net/thread-3981-1-1.html
作者: Batcher 时间: 2009-7-28 12:41
- change a.txt /from "鸡=7" /to "鸡=七"
复制代码
第三方命令行工具 change.exe 下载地址:
http://bbs.bathome.net/thread-3981-1-1.html
作者: Batcher 时间: 2009-7-28 13:53
- wfr a.txt -r:"鸡=7" -t:"鸡=七"
复制代码
第三方命令行工具 wfr.exe 下载地址:
http://bbs.bathome.net/thread-3981-1-1.html
作者: Lumiere 时间: 2009-7-28 14:08 标题: 回复 10楼 的帖子
这些第三方命令行工具都是谁写的啊?是你们自己么?
作者: keen 时间: 2009-7-28 14:12 标题: 回复 11楼 的帖子
Batcher兄对第三方工具用的如此炉火纯青!厉害呀!
作者: Lumiere 时间: 2009-7-28 14:14 标题: 回复 12楼 的帖子
让我羡慕到嫉妒啊……
作者: tireless 时间: 2009-7-28 15:07
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set var2=.
- set var=%%a
- if "!var:鸡=!" neq "!var!" set var2=
- if "!var:7=!" neq "!var!" set var2=
- if not defined var2 (
- set var=!var:"=[[q]]!
- set var=!var:鸡=" "鸡!
- for %%a in ("!var:7=7" "!") do (
- if %%a=="鸡=7" (set var2=!var2!鸡=七) else set var2=!var2!%%~a
- )
- echo !var2:[[q]]="!
- ) else echo;!var!
- )
-
- pause
复制代码
作者: Lumiere 时间: 2009-7-28 17:23 标题: 回复 14楼 的帖子
tireless毕竟是上校啊,佩服,从整个要替换的字符串“鸡=7”着手替换,清晰明了。而我就太专注于将=替换为别的字符了。学习了……
还有啊,我觉得你这句“ set var=!var:"=[[q]]!”还是有疏漏的,万一文本中有字符串[[q]]咋办?我觉得输入一个单一字符然后用一个findstr过滤一下文本还是有必要的。不怕一万只怕万一。编程要的就是严谨。
再次学习了……
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |