2013-04-11 53 views
3

我正在尝试将简单的批量双引号替换为单引号。 测试字符串必须包含特殊字符,最多为:"<LF>" 我无法替换那里的双引号,因为批次只存在于Syntaxerror。你知道为什么,或者如何克服这个?用特殊字符不能正常工作的批量替换

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

回答

2

使用延迟扩张解释为输入/输出管道:

setlocal enabledelayedexpansion 
SET TEST="<LF>","<HT>" 
SET modified=!TEST:"='! <-- Syntaxerror 
ECHO !modified! 

由于Mr Fuzzy Button注意到,pro瑕疵是shell将<>解释为重定向。延迟扩展(使用!而不是%)在解析后扩展变量,因此不影响重定向。

您可以放入引号内的说法解决SET无延迟扩展:

SET "modified=!TEST:"='!" 

但是,ECHO仍然是有问题的,然后。

+0

这很好,可能是最好的,因为我只需对现有文件进行微小的修改即可。 – membersound 2013-04-11 09:14:30

+0

所以我正确的我总是必须使用'!modified!'而不是'%modified%''无论使用哪个变量?或者我可以以某种方式将它“转换”回变量,该变量可以再次与'%'一起使用,以便我不必更改其他代码? – membersound 2013-04-11 09:20:40

+0

是的,它必须是启用延迟扩展(即从'setlocal'直到匹配的'endlocal'或执行结束时)。否则,你只会得到'!modified!'而不是值。它仍然是一个正常的变量。唯一改变的是它扩展到它的价值时的语义。延迟扩展更类似于其他编程语言中变量的工作方式。如果你使用'%modified%',它会起作用,但只要你有'<' or '>'这样的东西就会搞砸了,除非你引用正确。 'echo'不能被引用。 – Joey 2013-04-11 09:38:15

0

这对我的作品......

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

问题就出在你的< S和> S是在Echo

+0

你让我错了。 teststring是一个我想要替换的固定(!)字符串。我无法更改测试字符串,因此无法删除< >字符。 – membersound 2013-04-11 09:04:36

1

虽然延迟扩展是一件好事,但没有必要回答这个问题。有时候setlocal不可用。我遇到了一个。

在windows shell中,引号的字符串匹配适用于最外面的匹配对(大多数情况下,但不是全部),而不是最内层。

SET TEST="<LF>","<HT>" 
echo %TEST% 
SET "modified=%TEST:"='%" 
echo.|set /p "___=%modified%" 

解决方法:如果echo无法打印某些内容,请设置can。去搞清楚。

+1

我喜欢你的答案,但你需要逃避你想要替换的字符,以便正确打印字符串:'set modified =!TEST:^&= ^^^&!'。虽然我试图使用&符号转义 – 2017-01-22 02:34:53