我正在尝试使用vim中的反向引用和正则表达式进行搜索和替换操作。有趣的是,如果我进行纯搜索,它只会识别模式,但是如果我进行搜索并替换它会给我一个E486:模式未找到错误。
我有一堆形式的函数调用:
function( Nullable< double >(1.1), map[FOO] );
其中FOO是每行上的一些不同的变量名。我想把它变成
function( othermap[ FOO ], map[FOO] );
如果我尝试
:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
它给了我“Pattern not found error”。甚至
:%s/Null.*\(map[\)\(.*\)\]//g
不起作用,因为它只是没有识别模式。但是,如果我使用完全相同的搜索正则表达式尝试以下命令:
/Null.*\(map[\)\(.*\)\]
它正确地突出显示。接下来,我可以做%s // othermap [\ 2],\ 1 \ 2]来做我的替换。所以我毕竟能够做到更换,但我不能为我的生活理解为什么这种模式会在一种情况下被识别而在另一种情况下却不会被识别出来。
答案 0 :(得分:9)
我可以使用copy'n'paste从您的问题到我的vim
会话重现结果。我得到的详细信息是:
E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
请注意,它在开始时丢失了s/
。
然而,仔细观察这个问题,问题是没有转义的[
:
s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
^
|-- here; you need \[ to match the literal
我不使用%
符号;我会自动写:
:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g
捕捉略有不同。也没有必要在替换字符串中使用\]
中的反斜杠。
但是,这个命令对我也有用:
:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g