2

我需要搜索和替换这个:

ExecIf($["${debug}" = "1"]?NoOp

有了这个:

GoSub(chanlog,s,1(1,[${CHANNEL}] 

我似乎无法在 vim 中做到这一点,而且我不确定需要转义什么,因为我尝试过的任何方法都不起作用。

4

3 回答 3

4

如果您想更改包含大量标点符号的长字符串,并且它是完全匹配的(您不希望它们中的任何一个被视为正则表达式语法),您可以使用该nomagic选项将搜索模式解释为文字细绳。

:set nomagic
:%s/ExecIf($["${debug}" = "1"]?NoOp/GoSub(chanlog,s,1(1,[${CHANNEL}]/
:set magic

您仍然需要注意分隔符(s///命令的斜杠),但您可以使用任何字符,它不必是斜杠,所以当您有这样的东西并且搜索中有斜杠或替换字符串,只需选择其他内容,例如s@foo@bar@or s:bar:baz:

于 2012-07-02T01:29:06.000 回答
2

如果您在 vim 替换 ( :s//) 中对哪些字符进行转义时遇到问题,请记住这个nomagic概念,尤其是nomagic替换的版本::snomagic//:sno//. nomagic意思是:从字面上解释每个字符。

所以这应该可以工作,而不必担心替换中的转义字符:

:sno/ExecIf($["${debug}" = "1"]?NoOp/GoSub(chanlog,s,1(1, [${CHANNEL}]/

了解魔术与游牧:sno//,和\v\V

:help magic

搜索字符串的 nomagic 版本使用\V

/\VExecIf($["${debug}" = "1"]?NoOp
于 2012-07-02T01:29:53.113 回答
1

你必须逃避[]和 空格:

:s/ExecIf($\["${debug}"\ =\ "1"\]?NoOp/GoSub(chanlog,s,1(1,\[${CHANNEL}\]/

只是一点点试错

于 2012-07-02T01:29:53.667 回答