在vim搜索中找到的模式,但不是在vim搜索和替换?

bhh*_*988 7 vim search replace

我正在尝试使用vim中的反向引用和正则表达式进行搜索和替换操作.有趣的是,如果我进行纯搜索,它只会识别模式,但是如果我进行搜索并替换它会给我一个E486:模式未找到错误.

我有一堆形式的函数调用:

function( Nullable< double >(1.1), map[FOO] );
Run Code Online (Sandbox Code Playgroud)

其中FOO是每行上的一些不同的变量名.我想把它变成

function( othermap[ FOO ], map[FOO] );
Run Code Online (Sandbox Code Playgroud)

如果我试试

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
Run Code Online (Sandbox Code Playgroud)

它给了我"Pattern not found error".甚至

:%s/Null.*\(map[\)\(.*\)\]//g 
Run Code Online (Sandbox Code Playgroud)

不会起作用,因为它只是没有认识到这种模式.但是,如果我尝试使用完全相同的搜索正则表达式的以下命令:

/Null.*\(map[\)\(.*\)\]
Run Code Online (Sandbox Code Playgroud)

它突出正确.接下来,我可以做%s // othermap [\ 2],\ 1\2]来做我的替换.所以我毕竟能够做到更换,但我不能为我的生活理解为什么这种模式会在一种情况下被识别而在另一种情况下却不会被识别出来.

Jon*_*ler 9

我可以使用copy'n'paste从你的问题到我的vim会话重现结果.但是,我得到的详细信息是:

E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
Run Code Online (Sandbox Code Playgroud)

请注意,它s/在开始时丢失了.

然而,仔细看这个,麻烦是一个没有转义[:

s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
             ^
             |-- here; you need \[ to match the literal
Run Code Online (Sandbox Code Playgroud)

我不使用%符号; 我会自动写:

:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g
Run Code Online (Sandbox Code Playgroud)

捕获略有不同.\]在替换字符串中也没有必要使用反斜杠.

但是,这个命令对我也有用:

:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g
Run Code Online (Sandbox Code Playgroud)