在递归搜索中转义反向引用
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
的捕获组,即使它看起来像。您正在使用相同的模式进行新搜索并在该新搜索中引用捕获组。
是否可以在递归调用(或内部 :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
的捕获组,即使它看起来像。您正在使用相同的模式进行新搜索并在该新搜索中引用捕获组。