2

我有这个带数字的文本:

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

这是我一直用来增加或减少选择/块选择/列中数字的代码: pe 将上述文本中的最后 4 个数字增加 8:

 '<,'>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 保留前导零并按照我的意愿进行工作,但是:
- 我已经看到它不能用于替代命令 ('<,'>s/)
- 我不知道如何将 pe 200 添加到数字列表中(200 x ?)

4

3 回答 3

4

前导零生成数字8-based

(0035)8 == (29)10

你可以在 vim 中测试:

:echo 0035 == 29

它会打印1(真)。


尝试这个:

:%s/\(\<[0-9]\{4}\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/
于 2012-04-17T16:36:38.590 回答
2

这个?

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

编辑

@Remonn,您应该在问题中提供正确的示例输入。上面的行适用于您的示例。

对于您的新要求,请查看以下行:

输入:

40
20
120
0500
230
0000000020
00000000000005000

vim命令:

:%!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。

祝你好运

于 2012-04-17T16:52:02.710 回答
0

默认情况下,Vim0将以八进制开头的数字处理。

出于这个原因,我的 .vimrc 中有这个:

set   nrformats-=octal  " Don't bother with octal, I never use it
于 2012-04-18T04:59:27.337 回答