在递归搜索中转义反向引用

Escaping back-references in recursive search

是否可以在递归调用(或内部 :s 调用中反向引用外部 :g 命令的结果?)

比如我想搜索光标上方的内容,当它出现在光标下方时修改它:

:1,.g/Hello, \(\w\+\)!/.,$s//-San

这应该替换:

Hello, Luciano!

Goodbye, Luciano!

Hello, Luciano!

Goodbye, Luciano-San!

如果将光标放在空行上。

但是,它抱怨无效的反向引用。这是参考最后一个 </code> <s>(请注意,可能令人惊讶的是搜索模式中的第一个 <code> - 但不是替换 - 有效!)。原因很可能是 :s 表达式没有任何捕获组。

所以我的问题是,是否有办法 'escape' 在 :g 中执行的命令的内部上下文能够 back-reference 来自外部的匹配组克?

(我很欣赏在上面人为的例子中有其他方法可以达到预期的效果 - 但我的问题具体涉及转义反向引用,而不是编写更好的正则表达式 - 这里的例子只是为了说明)

可以在搜索模式中使用反向引用:

before: xoxoxo foobarfoo xoxoxo

/\(foo\)bar

after: xoxoxo foobarfoo xoxoxo
              ^^^^^^^^^

以及替换部分的替换:

before: xoxoxo foobarfoo xoxoxo

:s/\(foo\)bar/bazbaz

after: xoxoxo bazfoobaz xoxoxo

这是可能的,因为捕获组和反向引用在单个原子“命令”中占用相同的“模式space”。

当您执行 :g/<pattern>/<cmd> 时,<cmd> 是一个单独的“命令”,不共享 :g 的“模式 space”,因此不可能在 <cmd>.

中引用来自 <pattern> 的捕获组

不过,可以在 <cmd> 中重用 <pattern>:

:g/\(foo\)bar/s//bazbaz

但您仍然没有在 :s 中引用来自 :g 的捕获组,即使它看起来像。您正在使用相同的模式进行新搜索并在该新搜索中引用捕获组。