Vim 用模式内的升序数字替换

Vim substitute with ascending numbers inside a pattern

我有这样的模式:

word0word
word0word
word0word

我需要像这样对模式的出现次数进行编号:

word1word
word2word
word3word

我发现我可以做到这一点:

:let @a=1 | %s/word0/\='word'.(@a+setreg('a',@a+1))/g

但它省略了模式的其余部分(第二个 "word",我需要将其包括在内以识别模式)。 有没有办法包含模式的其余部分?我试过了:

:let @a=1 | %s/word0word/\='word'.(@a+setreg('a',@a+1))'word'/g

但是那个returns一个错误。 我还考虑过将其与 \zs\ze 结合使用,但我不确定如何处理。

在您的第二个模式中,您只是缺少一个 .(表示连接)。
这将起作用:

:let @a=1 | %s/word0word/\='word'.(@a+setreg('a',@a+1)).'word'/g
                                          " this one --^

请注意,如果您想在子替换表达式中使用捕获组,您需要使用 submatch(x) 而不是 \x(将 x 替换为匹配项的编号,从 1) 开始:

:let @a=1 | %s/\vword0(\w+)/\='word'.(@a+setreg('a',@a+1)).submatch(1)/g

有关使用子替换表达式的详细信息,请参阅 :h sub-replace-\=