Vim:用n + 1替换n

时间:2013-10-05 08:09:10

标签: vim replace

如何使用n替换与特定模式匹配的每个数字n+1?例如。我想用值+ 1替换括号中的所有数字。

1 2 <3> 4 <5> 6 7 <8> <9> <10> 11 12

应该成为

1 2 <4> 4 <6> 6 7 <9> <10> <11> 11 12

2 个答案:

答案 0 :(得分:12)

%s/<\zs\d\+\ze>/\=(submatch(0)+1)/g

作为解释:

%s          " replace command
"""""
<           " prefix
\zs         " start of the match
\d\+        " match numbers
\ze         " end of the match
>           " suffix
"""""
\=          " replace the match part with the following expression
(
submatch(0) " the match part
+1          " add one
)
"""""
g           " replace all numbers, not only the first one

编辑: 如果您只想替换特定行,请将光标移到该行上,然后执行

s/<\zs\d\+\ze>/\=(submatch(0)+1)/g

或使用

LINENUMs/<\zs\d\+\ze>/\=(submatch(0)+1)/g

(将LINENUM替换为实际行号,例如13)

答案 1 :(得分:4)

在vim中,您可以按

递增(递减)光标上或之后的数字
NUMBER<ctrl-a>      to add NUMBER to the digit 
(NUMBER<ctrl-x>      to substract NUMBER from the digit)

如果只递增(递减)1,则不需要指定NUMBER。在你的情况下,我会使用一个简单的macro

qaf<<ctrl-a>q

100<altgr-q>a

这里是宏的简要说明:它使用find(f)commant将光标放在开头&lt;托架。没有必要将光标定位在数字上。按下光标上的数字或光标后的最接近的数字将增加。

如果您想要更短的一系列命令,可以按f<来定位光标ONCE,使用ctrl-a增加数字,然后重复按;.;命令重复最后一个光标移动,即find命令。 .命令重复上一次文本更改命令。

请查看此link以获取更多信息,或使用内置文档:h: ctrl-a