我知道这是一个很长的镜头,但我有一个巨大的文本文件,我需要将一个给定的数字添加到符合某些标准的其他数字。
例如
identifying text 1.1200
identifying text 1.1400
我希望将此(通过添加说1.15)转换为
identifying text 2.2700
identifying text 2.2900
通常情况下,我会在Python中执行此操作,但它是在Windows机器上,我无法安装太多东西。我有Vim虽然:)
答案 0 :(得分:18)
这是对hobbs解决方案的简化和修复:
:%s/identifying text \zs\d\+\(.\d\+\)\=/\=(1.15+str2float(submatch(0)))/
感谢\zs
,无需回忆主要文字。感谢str2float()
对整个数字进行了一次添加(换句话说,1.15 + 2.87将给出预期结果,4.02,而不是3.102)。
当然这个解决方案需要最新版本的Vim(7.3?)
答案 1 :(得分:10)
您可以执行捕获正则表达式,然后使用vimscript表达式作为替换,例如
:%s/\(identifying text \)\(\d\+\)\.\(\d\+\)/
\=submatch(1) . (submatch(2) + 1) . "." . (submatch(3) + 1500)
(仅限没有换行符。)
答案 2 :(得分:3)
您的数字格式似乎是固定的,因此很容易转换为int并返回(删除点)添加11500并将点放回去。
:%s/\.//
:%normal11500^A " type C-V then C-a
:%s/....$/.&/
如果您不想在所有行上执行此操作,但只有与“识别文本”匹配的行替换所有%by'g / indentifying text /'
答案 3 :(得分:1)
对于整数,您只需使用 n ^ A将 n 添加到数字(和 n ^ X以减去它)。我怀疑这是否适用于分数。
答案 4 :(得分:1)
这可能不是vim的解决方案,但我认为awk可以提供帮助:
cat testscript | LC_ALL=C awk '{printf "%s %s %s %s %.3f\n", $1,$2,$3,$4,$5+1.567 }'
和测试
this is a number 1.56
this is a number 2.56
this is a number 3.56
我需要LC_ALL = C来正确转换浮点分隔符,并且可能有更优雅的解决方案来打印字符串的开头/结尾。结果如下:
this is a number 3.127
this is a number 4.127
this is a number 5.127
答案 5 :(得分:1)
使用宏
qa .......................... start record macro 'a'
/iden<Enter> ................ search 'ident*' press Enter
2w .......................... jump 2 words until number one (before dot)
Ctrl-a ...................... increases the number
2w .......................... jump to number after dot
1500 Ctrl-a ................. perform increases 1500 times
q ........................... stop record to macro 'a'
如果您现在有300行使用此模式
300@a