【问题标题】:pattern found in vim search, but not in vim search and replace?在 vim 搜索中找到模式,但在 vim 搜索和替换中没有?
【发布时间】:2011-11-09 14:57:55
【问题描述】:

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

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

function( Nullable< double >(1.1), map[FOO] );

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

function( othermap[ FOO ], map[FOO] );

如果我尝试

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g

它给了我“找不到模式错误”。甚至

:%s/Null.*\(map[\)\(.*\)\]//g 

不会工作,因为它只是无法识别模式。但是,如果我使用完全相同的搜索正则表达式尝试以下命令:

/Null.*\(map[\)\(.*\)\]

它正确突出显示。之后,我可以做 %s//othermap[ \2 ], \1\2] 来代替我。所以我毕竟能够进行替换,但我一生都无法理解为什么这种模式在一种情况下会被识别,而在另一种情况下却不会。

【问题讨论】:

标签: search vim replace


【解决方案1】:

我可以使用 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

【讨论】:

  • 哦,我不知道您也必须转义第一个方括号。方括号的行为对我来说很奇怪,因为即使我没有逃避它,它似乎也经常在许多情况下工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 2013-08-20
  • 1970-01-01
  • 2011-06-15
  • 2011-03-04
  • 1970-01-01
  • 2015-02-15
  • 2011-08-06
相关资源
最近更新 更多