递增和递减数字
Posted
技术标签:
【中文标题】递增和递减数字【英文标题】:Increment and decrements numbers 【发布时间】:2012-04-29 00:19:56 【问题描述】:我有这个带有数字的文本:
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
这是我一直用来增加或减少选择/块选择/列中数字的代码: 体育将上述文本中的最后 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
它会删除前导零(如果有前导零,我想保留它们
如果没有前导零,则不要添加它们)
它将所有数字都加了 8,除了 37,它加了 2。(为什么?)
谁能帮我找到一个正则表达式来添加/减去数字 从选择(或块选择)而不丢失前导零的?
注意: 我注意到 Control A + Control x 保留前导零并按照我的意愿完成工作,但是: - 我已经看到它不能用于替代命令 ('s/) - 我不知道如何添加 p.e. 200 到一个数字列表 (200 x ?)
【问题讨论】:
如果有任何帮助,我更喜欢做这样的事情的方式是编写一个外部过滤器(例如,在 perl 中),然后在块上使用 !/path/filter.pl。这使得问题更容易解决,并且过滤器易于重用和修改。 【参考方案1】:前导零表示数字8-based
。
(0035)8 == (29)10
你可以在 vim 中测试:
:echo 0035 == 29
它将打印1
(true)。
试试这个:
:%s/\(\<[0-9]\4\>\)\@=0*\([0-9]*\)/\=submatch(2)+8/
【讨论】:
"@Kev,我检查了你的正则表达式。它工作正常,但我注意到当它附加到文本字符 pe text22text 或 22text 时它不考虑数字。我必须更改为让它工作?(顺便说一句,我认为子匹配正则表达式不可能保持前导零,不是吗?)【参考方案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。
祝你好运
【讨论】:
谢谢肯特,不错的正则表达式。但是我注意到它也用于没有前导零的数字,前导零。如果有,我想保留前导零,如果没有,我想不添加它们(就像 C-A / C-X 一样)。 取这些数字:40, 20, 120, 0500, 230
- 上面的正则表达式给出了错误的结果。输出:48, 28, 200, 1300, 310
"@Kent 我在我的问题中谈到了一个通用的正则表达式 :) 感谢 awk。它工作正常。我会保留它。但是 awk 不会更改文本中的 @/ 数字就像kev的正则表达式一样。(顺便说一句,你们在评论前添加@Name吗?)【参考方案3】:
默认情况下,Vim 将以 0
开头的数字视为八进制。
出于这个原因,我的 .vimrc 中有这个:
set nrformats-=octal " Don't bother with octal, I never use it
【讨论】:
嗨,Johnsyweb,我检查了这个,但没有任何改变。以上是关于递增和递减数字的主要内容,如果未能解决你的问题,请参考以下文章