Vim用模式中的升序代替

时间:2015-03-28 17:25:38

标签: vim replace substitution

我有这样的模式:

word0word
word0word
word0word

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

word1word
word2word
word3word

我发现我可以这样做:

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

但它忽略了模式的其余部分(第二个“单词”,我需要包含它来识别模式)。 有没有办法包括其余的模式?我试过了:

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

但是这会返回错误。 我还想过将它与\zs\ze结合起来,但我不确定如何处理它。

1 个答案:

答案 0 :(得分:1)

在你的第二种模式中,你只是错过了.(表示连接) 这将有效:

: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-\=