如何在vim中转义搜索字符串?

时间:2012-07-02 01:20:54

标签: regex vim

我需要搜索并替换它:

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

用这个:

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

我似乎无法在vim中执行此操作,而且我不确定需要进行哪些操作,因为我尝试过的任何工作都没有。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

如果你在vim替换中遇到哪些字符有问题(:s // ),请记住nomagic概念,特别是nomagic替代版本::snomagic // :sno // nomagic表示:按字面解释每个字符。

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

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

了解魔法与nomagic,:sno // \ v \ V

:help magic

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

/\VExecIf($["${debug}" = "1"]?NoOp

答案 2 :(得分:1)

你必须逃离[]和空格:

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

只是有点反复试验