批量替换特殊字符无效

3

我想简单地将双引号替换为单引号。 测试字符串必须包含特殊字符,最多:"<LF>"。 当批处理程序出现Syntaxerror时,我无法在那里替换双引号。您知道原因或如何解决吗?

SET TEST="<LF>","<HT>"
SET modified=%TEST:"='%  <-- Syntaxerror
ECHO %modified%
3个回答

2
使用延迟扩展:
setlocal enabledelayedexpansion
SET TEST="<LF>","<HT>"
SET modified=!TEST:"='!  <-- Syntaxerror
ECHO !modified!

Fuzzy Button先生所述,问题在于shell将<>解释为重定向符。使用!而不是%的延迟扩展会在解析后扩展变量,因此不会影响重定向。
您可以通过将参数括在引号中来解决没有延迟扩展的SET问题:
SET "modified=!TEST:"='!"

但是,那么ECHO依然会存在问题。

这很棒,也许是最好的选择,因为我只需要对现有文件进行微小的修改。 - membersound
那么我是不是总是必须在使用此变量时使用!modified!而不是%modified%?或者我是否可以以某种方式“转换”它回到可以再次使用%的变量,以便我不必更改其他代码? - membersound
是的,而且必须在启用延迟扩展时(即从setlocal到其匹配的endlocal或执行结束为止)。否则,您只会得到!modified!而不是该值。它仍然是一个普通变量。唯一改变的是它被扩展为其值的语义。延迟扩展更类似于其他编程语言中变量的工作方式。如果您使用%modified%,它将起作用,但只要您有像<>之类的东西,除非您正确引用,否则它会搞乱事情。而且echo不能被引用。 - Joey

1
虽然延迟扩展是一件好事,但它并不是回答这个问题所必需的。有时候setlocal也不可用。我就遇到过这种情况。
在Windows shell中,引号的字符串匹配只适用于最外层的匹配对(在大多数情况下,但并非全部),而不是最内层的匹配。
SET TEST="<LF>","<HT>"
echo %TEST%
SET "modified=%TEST:"='%"
echo.|set /p "___=%modified%"

解决方法:如果echo无法打印某些内容,那么使用set命令。很神奇。


1
我喜欢你的回答,但是为了正确打印字符串,你还需要转义要替换的字符:set modified=!TEST:^&=^^^&!。我之前尝试过和号转义。 - Chef Pharaoh

0

这对我有效...

SET TEST="LF","HT"
echo %TEST%
SET modified=%TEST:"='%
ECHO %modified%

问题在于你的<>被解释为Echo中的输入/输出管道。

1
你误解了我的意思。teststring是一个固定的字符串,我想要替换它。我不能改变teststring,因此也不能删除< >字符。 - membersound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接