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

[文本处理] 批处理set命令中如何替换等号?

[复制链接]
发表于 2011-5-15 20:40:36 | 显示全部楼层 |阅读模式
set命令可以替换指定的字符串,但如果字符串包含等号,该如何替换,比如:
  1. @echo off
  2. set a=test=test
  3. set var=%a:test==%
  4. echo %var%
  5. pause
复制代码
希望替换后得到test,结果输出是三个等号===,显然set命令是将第一个等号作赋值号处理,将第一个等号前加转义字符^,改写如下:
  1. @echo off
  2. set a=test=test
  3. set var=%a:test^==%
  4. echo %var%
  5. pause
复制代码
结果输入test=test,也得不到想要的结果,如何实现其中等号的替换,高手看看有没有办法!!!
 楼主| 发表于 2011-5-15 00:02:43 | 显示全部楼层

批处理怎样替换包含等号的字符串?

1.txt中文本内容:
文本="刘姓" 动作="打开外部PDF文档" 页码="6"

现想将其中的“动作="打开外部PDF文档"”这几个字符串替换掉,写批处理如下:
  1. @echo off
  2. set a=动作="打开外部PDF文档"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (1.txt) do (set str=%%i
  5. set str1=!str:%a%=!
  6. echo !str1! >>fix.txt
  7. )
  8. pause
复制代码
但是运行之后并没有得到希望得到的字符串:文本="刘姓"  页码="6" ,而是得到了这个结果:文本="刘姓" "打开外部PDF文档"=="打开外部PDF文档" 页码="6"  ,仔细检查可能问题出现在!str:%a%=!上,因为替换字符串中有=号,但加了转义字符也不管用。请帮忙看看。。。
发表于 2011-5-15 06:58:54 | 显示全部楼层
为什么不直接获取1、3列呢?
发表于 2011-5-15 09:05:51 | 显示全部楼层
本帖最后由 wc726842270 于 2011-5-15 09:07 编辑

好久没上了,也没什么太好的思路,不过可以先把“=”先拿下去,再加上来。“DELIMS==”,有兴趣就试一下吧,这里的“%STR:=1=2%”只会将第一个等号视为内定的符号(用词不准确)。当然除了这种思路外,还可以展转一下也可以
 楼主| 发表于 2011-5-15 19:31:48 | 显示全部楼层
本帖最后由 ge_xin_yu 于 2011-5-15 19:45 编辑

2# hanyeguxing
没法获取列,因为包含这个字符串文件大概有几十个,文件中的具体文本格式并不相同,即便在同一个文件中,这个字符串的位置也不相同,有的在第三列,有的在其他列,有的和其他字符串混在一起,而且实际上的行很长,远不止这几列,用列提取不出来,要提的话也太麻烦,只能替换~~~
 楼主| 发表于 2011-5-15 19:48:53 | 显示全部楼层
本帖最后由 ge_xin_yu 于 2011-5-15 19:59 编辑

3# wc726842270

感谢答复,问题是实际上的文本内容中包含不止一个等号,如果用“delims==",那么其他的等号也被清空了。。。另外,我第一个等号前用了转义字符为什么批处理仍然将其作为赋值符号处理,而不是作为一个普通字符呢,??奇怪!!
 楼主| 发表于 2011-5-15 19:56:16 | 显示全部楼层
set 替换字符串时能不能用正则表达式呢?如果支持,就可以了替换这个字串中的等号了!!
发表于 2011-5-15 20:49:11 | 显示全部楼层
两边加上双引号
 楼主| 发表于 2011-5-15 22:12:50 | 显示全部楼层
2# 习风口
你显然是没有测试过,信口开河,两边加上引号是不行的。。。。。。。。。
 楼主| 发表于 2011-5-15 22:14:42 | 显示全部楼层
这个问题真奇怪,难得批处理没有解决这个问题的办法,高人何在?
发表于 2011-5-15 22:17:15 | 显示全部楼层
问题比较麻烦
以下的两个思路可以参考以下
http://www.bathome.net/viewthrea ... omuid=3023#pid77341
http://www.bathome.net/viewthrea ... omuid=3023#pid77497

可能以前还提到了一些其它方法
善用搜索
发表于 2011-5-15 23:26:21 | 显示全部楼层
要想彻底解决这个问题估计要找比尔。。。
发表于 2011-5-15 23:40:09 | 显示全部楼层
本帖最后由 applba 于 2011-5-16 03:09 编辑

set命令在执行初期会处理引号、等号。
第一个等号作为变量名和值的分隔符!
任何字符都可以作为变量名,除了等号。

变量引用增强时,(字符串替换时)依然把第一个=看作分隔符。

解决方法如下,你的var完全是多余的:
  1. @echo off
  2. set a=test=test
  3. echo %a:test==%
  4. pause
复制代码
变量引用增强时,(字符串替换时)依然把第一个=看作分隔符。
所以上面的方法自然也是无效的。
但是字符串的截取是不涉及=号分隔符的。
  1. @echo off
  2. SETLOCAL enabledelayedexpansion
  3. set "a=test=test"
  4. echo %a%
  5. echo !a:test^==-4!
  6. pause
复制代码
以上代码复合题意……
发表于 2011-5-15 23:49:48 | 显示全部楼层
set语句进行等号的替换绝对会出错,你要回避set这一用用法!
发表于 2011-5-16 00:45:44 | 显示全部楼层
用for + "delims==" 再合并
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:26 , Processed in 0.021929 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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