2012-07-02 118 views
2

我需要搜索和替换这样的:如何在vim中转义搜索字符串?

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

与此:

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

我似乎无法做到这一点的VIM,和我不知道需要转义什么,因为没有我试过的作品。

回答

1

你要逃离[]和空间:

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

只是有点试验和错误

+0

啊,我曾尝试过所有的空间......但谢谢! – lorsungcu

3

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

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

你仍然需要注意的分隔符(在s///命令的斜线),但你可以使用任何字符的是,它并没有成为一个斜线,所以当你有这样的事情并且在搜索或替换字符串中有斜杠,只需选择其他字符,如[email protected]@[email protected]s:bar:baz:

2

如果您遇到与在VIM替代逃跑的字符问题(:■//),记得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 
+0

我使用'SNO/...',BT得到尝试相同的结果;它说这种模式没有找到。 – lorsungcu

+0

hrm首先确保我们都没有打字错误。然后用':set incsearch'开启'incsearch',然后开始输入nomagic search:'/ \ VExecIf' ...并且确保你以这种方式得到文件中的匹配。另外,魔术替代品(逃避第一个[']为你工作? – pb2q