Search 递增和递减数字

Search 递增和递减数字,search,vim,numbers,increment,decrement,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 这是我一直用来递增或递减选择/块选择/列中的数字的代码: p、 e.将上述文本中的最后4个数字增加8: '<,'>s/\%V\<\d\{4}\>/\=submatch(0

我有这段文字和数字:

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
这是我一直用来递增或递减选择/块选择/列中的数字的代码: p、 e.将上述文本中的最后4个数字增加8:

 '<,'>s/\%V\<\d\{4}\>/\=submatch(0)+8/g
's/)

-我不知道如何将p.e.200添加到数字列表中(200 x?

前导零使数字
以8为基础

(0035)8 == (29)10
您可以在vim中进行测试:

:echo 0035 == 29
它将打印
1
(true)


试试这个:

:%s/\(\<[0-9]\{4}\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/
:%s/\(\\)\@=0*\([0-9]*\)/\=子匹配(2)+8/
这是什么

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

@雷蒙,你应该在问题中给出正确的示例输入。上面这行代码适用于您的示例

有关您的新需求,请查看以下行:

输入:

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


好运

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

因此,我的.vimrc中有以下内容:

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

如果有什么帮助的话,我更喜欢这样做的方式是编写一个外部过滤器(如perl),然后使用/块上的路径/filter.pl。这使得问题更容易解决,过滤器也更容易重用和修改。谢谢Kent,很好的正则表达式。但是我注意到它也适用于没有前导零的数字,前导零。如果有,我希望保留前导零,如果没有则不添加它们(如C-A/C-X所做)。取这些数字:
40、20、120、0500、230
-上面的正则表达式给出错误的结果。输出:
48、28、200、1300、310
“@Kent我在我的问题中谈到了一个通用正则表达式:)谢谢awk。它工作正常。我会保留它。但是awk不会像kev的正则表达式那样更改文本中的@/数字。(顺便问一句,你们在评论之前添加@Name吗?)嗨,约翰西韦布,我检查了这个,但它没有改变任何东西。”@kev,我查了你的正则表达式。它运行良好,但我注意到它不考虑数字时,它附加到文本字符体育文本22或22文本。我需要做什么改变才能让它起作用?(顺便说一句,我想用子匹配正则表达式不可能保持领先于零,不是吗?)
set   nrformats-=octal  " Don't bother with octal, I never use it