增加和减少数字

时间:2012-04-17 16:13:09

标签: search vim numbers increment decrement

我有这个带有数字的文字:

My numbers are 04, and 0005
My numbers are 05, and 0006
My numbers are 06, and 0035
My numbers are 07, and 0007
My numbers are 08, and 0009

这是我一直用来增加或减少选择/块选择/列中的数字的代码: 体育用8:

增加上面文本中的最后4个数字
 '<,'>s/\%V\<\d\{4}\>/\=submatch(0)+8/g

但我今天注意到它做的很奇怪。 这是输出:

My numbers are 04, and 13
My numbers are 05, and 14
My numbers are 06, and 37 <---
My numbers are 07, and 15
My numbers are 08, and 17
  • 它删除了前导零(如果有前导零,我想保留它们) 如果没有前导零,则不添加它们)
  • 它为除37之外的所有数字添加了8,其中添加了2.(为什么?)

任何人都可以帮我 找一个正则表达式来添加/减去数字 选择(或块选择)而不会丢失前导零

请注意:
我注意到Control A + Control x保持前导零并按我的要求完成工作但是:
- 我已经看到它不能用于替代命令('&lt;,'&gt; s /)
- 我不知道如何添加p.e. 200到数字列表(200 x?)

3 个答案:

答案 0 :(得分:4)

前导零使数字8-based

(0035)8 == (29)10

你可以在vim中测试:

:echo 0035 == 29

它会打印1(true)。


试试这个:

:%s/\(\<[0-9]\{4}\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/

答案 1 :(得分:2)

此?

:%s/\v[0-9]{4}/\=printf("%04d", substitute(submatch(0), '^0\+', '', 0)+8)/   

修改

@Remonn,你应该在你的问题中给出正确的样本输入。上面的一行适用于你的例子。

根据您的新要求,请看下面的一行:

输入:

40
20
120
0500
230
0000000020
00000000000005000

vim cmd:

:%!awk '{if($0~/^0/){f="\%"length($0)"d";$0+=8; s=sprintf(f,$0); gsub(/ /,"0",s);}else s=$0+8;print s}'

会将文件更改为:

48
28
128
0508
238
0000000028
00000000000005008

在我的cmd中,我使用'%',您可以选择(v)您想要使用的数字,然后尝试使用我的cmd。

祝你好运

答案 2 :(得分:0)

默认情况下,Vim会将以0开头的数字视为八进制。

因此我在.vimrc中有这个:

set   nrformats-=octal  " Don't bother with octal, I never use it