Vim搜索和替换,添加常量

时间:2010-11-16 11:16:10

标签: regex vim data-manipulation

我知道这是一个很长的镜头,但我有一个巨大的文本文件,我需要将一个给定的数字添加到符合某些标准的其他数字。

例如

identifying text 1.1200
identifying text 1.1400

我希望将此(通过添加说1.15)转换为

identifying text 2.2700
identifying text 2.2900

通常情况下,我会在Python中执行此操作,但它是在Windows机器上,我无法安装太多东西。我有Vim虽然:)

6 个答案:

答案 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