标题: [文本处理] 批处理set命令中如何替换等号? [打印本页]
作者: ge_xin_yu 时间: 2011-5-15 00:02 标题: 批处理怎样替换包含等号的字符串?
1.txt中文本内容:
文本="刘姓" 动作="打开外部PDF文档" 页码="6"
现想将其中的“动作="打开外部PDF文档"”这几个字符串替换掉,写批处理如下:- @echo off
- set a=动作="打开外部PDF文档"
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (set str=%%i
- set str1=!str:%a%=!
- echo !str1! >>fix.txt
- )
- pause
复制代码
但是运行之后并没有得到希望得到的字符串:文本="刘姓" 页码="6" ,而是得到了这个结果:文本="刘姓" "打开外部PDF文档"=="打开外部PDF文档" 页码="6" ,仔细检查可能问题出现在!str:%a%=!上,因为替换字符串中有=号,但加了转义字符也不管用。请帮忙看看。。。
作者: hanyeguxing 时间: 2011-5-15 06:58
为什么不直接获取1、3列呢?
作者: wc726842270 时间: 2011-5-15 09:05
本帖最后由 wc726842270 于 2011-5-15 09:07 编辑
好久没上了,也没什么太好的思路,不过可以先把“=”先拿下去,再加上来。“DELIMS==”,有兴趣就试一下吧,这里的“%STR:=1=2%”只会将第一个等号视为内定的符号(用词不准确)。当然除了这种思路外,还可以展转一下也可以
作者: ge_xin_yu 时间: 2011-5-15 19:31
本帖最后由 ge_xin_yu 于 2011-5-15 19:45 编辑
2# hanyeguxing
没法获取列,因为包含这个字符串文件大概有几十个,文件中的具体文本格式并不相同,即便在同一个文件中,这个字符串的位置也不相同,有的在第三列,有的在其他列,有的和其他字符串混在一起,而且实际上的行很长,远不止这几列,用列提取不出来,要提的话也太麻烦,只能替换~~~
作者: ge_xin_yu 时间: 2011-5-15 19:48
本帖最后由 ge_xin_yu 于 2011-5-15 19:59 编辑
3# wc726842270
感谢答复,问题是实际上的文本内容中包含不止一个等号,如果用“delims==",那么其他的等号也被清空了。。。另外,我第一个等号前用了转义字符为什么批处理仍然将其作为赋值符号处理,而不是作为一个普通字符呢,??奇怪!!
作者: ge_xin_yu 时间: 2011-5-15 19:56
set 替换字符串时能不能用正则表达式呢?如果支持,就可以了替换这个字串中的等号了!!
作者: ge_xin_yu 时间: 2011-5-15 20:40 标题: 批处理set命令中如何替换等号?
set命令可以替换指定的字符串,但如果字符串包含等号,该如何替换,比如:- @echo off
- set a=test=test
- set var=%a:test==%
- echo %var%
- pause
复制代码
希望替换后得到test,结果输出是三个等号===,显然set命令是将第一个等号作赋值号处理,将第一个等号前加转义字符^,改写如下:- @echo off
- set a=test=test
- set var=%a:test^==%
- echo %var%
- pause
复制代码
结果输入test=test,也得不到想要的结果,如何实现其中等号的替换,高手看看有没有办法!!!
作者: 习风口 时间: 2011-5-15 20:49
两边加上双引号
作者: ge_xin_yu 时间: 2011-5-15 22:12
2# 习风口
你显然是没有测试过,信口开河,两边加上引号是不行的。。。。。。。。。
作者: ge_xin_yu 时间: 2011-5-15 22:14
这个问题真奇怪,难得批处理没有解决这个问题的办法,高人何在?
作者: qzwqzw 时间: 2011-5-15 22:17
问题比较麻烦
以下的两个思路可以参考以下
http://www.bathome.net/viewthrea ... omuid=3023#pid77341
http://www.bathome.net/viewthrea ... omuid=3023#pid77497
可能以前还提到了一些其它方法
善用搜索
作者: batman 时间: 2011-5-15 23:26
要想彻底解决这个问题估计要找比尔。。。
作者: applba 时间: 2011-5-15 23:40
本帖最后由 applba 于 2011-5-16 03:09 编辑
set命令在执行初期会处理引号、等号。
第一个等号作为变量名和值的分隔符!
任何字符都可以作为变量名,除了等号。
变量引用增强时,(字符串替换时)依然把第一个=看作分隔符。
解决方法如下,你的var完全是多余的:- @echo off
- set a=test=test
- echo %a:test==%
- pause
复制代码
变量引用增强时,(字符串替换时)依然把第一个=看作分隔符。
所以上面的方法自然也是无效的。
但是字符串的截取是不涉及=号分隔符的。- @echo off
- SETLOCAL enabledelayedexpansion
- set "a=test=test"
- echo %a%
- echo !a:test^==-4!
- pause
复制代码
以上代码复合题意……
作者: applba 时间: 2011-5-15 23:49
set语句进行等号的替换绝对会出错,你要回避set这一用用法!
作者: yjstone 时间: 2011-5-16 00:45
用for + "delims==" 再合并
作者: ge_xin_yu 时间: 2011-5-16 02:32
7# applba
你的代码和使用set命令一样,同样是输出三个等号,不知道有没有测试过。。。。
作者: ge_xin_yu 时间: 2011-5-16 02:46
本帖最后由 ge_xin_yu 于 2011-5-16 02:52 编辑
弄半天是微软的bug,我有一堆文件,被替换的文字包含等号,看来用批处理是没戏了,我还是老老实实用编辑器替换吧,,,
作者: ge_xin_yu 时间: 2011-5-16 02:49
7# applba
不用set ,直接echo也是不行的。。。。兄弟测试过吗??
作者: Batcher 时间: 2011-5-16 12:54
10# ge_xin_yu
能否贴一点文本出来看看?我可以帮你试试
作者: Hello123World 时间: 2011-5-16 13:16
按照5楼给出的思路,是逐个替换才能替换掉“=”,但你的要求是把“test=”合起来替换为空,如此,我只能想到偏移来实现要求——%a:5%。
作者: 习风口 时间: 2011-5-17 19:54
9# ge_xin_yu
set a=动作="打开外部PDF文档" 该改为 set a=“动作="打开外部PDF文档"”
不然会把 "打开外部PDF文档" 赋值给a 和 动作
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |