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-\=
。
我有这样的模式:
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-\=
。