我有这个带有数字的文字:
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
任何人都可以帮我 找一个正则表达式来添加/减去数字 选择(或块选择)而不会丢失前导零 ?
请注意:
我注意到Control A + Control x保持前导零并按我的要求完成工作但是:
- 我已经看到它不能用于替代命令('&lt;,'&gt; s /)
- 我不知道如何添加p.e. 200到数字列表(200 x?)
答案 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