如何在Vim中对数字进行算术操作?

32

如果我有一个包含数字列的数据文件,例如:

3.14
0.42
6.66

在Vim中是否有一种方法可以使用加法、减法和除法等运算来操作这些数字?比如说,我想要在一个列中的每个数字上加2.1,该怎么做呢?

我可以通过将其导入到例如Awk脚本中进行操作,但我想知道是否有内置方法,而我在帮助文件中没有找到相关内容。


我的NumUtils插件可以完美地实现你想要的功能。你可以进行加、减、乘、除运算,或者编写自己的函数来完成计算。为了回答这个问题,你可以使用:%NumUtilsAdd 2.1 - bimlas
3个回答

43

使用表达式寄存器=,结合CTRL-R命令。

以下命令将在一行上将2.1添加到数字中:

C
<CTRL-R> =
<CTRL-R> "
+2.1
<ENTER>

使用宏结合,可以得到一些有趣的结果,比如这个例子


你是不是指的是双引号而非星号?否则系统剪贴板会出错。 - Sarah
你是对的。在我的当前配置下,在Windows上,“*”寄存器也映射到“”寄存器。 - Rod
1
有没有办法让这个与重复“.”函数一起工作?我想要它重复例如将这个单词乘以2 ciw<C-R>=<C-R>"*2<CR><Esc>,但不幸的是它只是用数学计算出来的结果替换了这个单词(这是公平的,因为这就是表达式寄存器计算出来的)。看起来我必须想出某种特殊的绑定,可以自动进行缓冲区写入。 - Steven Lu
1
@StevenLu:制作一个宏。按下 q<任意字母>,进行你想要记录的操作,按下 q 停止录制,然后按下 q<相同字母> 播放它。 - Kevin
4
@Kevin,这个说法是错误的。按下“q<相同字母>”实际上会在该键记录一个新的宏录制。要回放录制的宏,您需要按“@<相同字母>”。您也可以通过按“@@”来重复播放最后一次播放的宏。 - garetmckinley
显示剩余2条评论

7

表达式寄存器在vim中非常好用。

以下是一种更传统的vi方法: 假设你有一个包含许多数字的文件,每行一个数字,你想将每行数字加上2.1。

:%s/$/+2.1/<ENTER> - this would append +2.1 to each line.
:1<ENTER>  - Goto the beginning of the file 
!Gbc<ENTER> - invoke the bc command on each line to do the addition.

@Rod.. 确实需要使用cygwin。我提出这个建议是因为她提到了awk,所以我假设她可以访问bc。 - raja kolluru

5

一个有用的功能,在这种情况下很方便,是使用表达式进行替换(参见:help sub-replace-\=)。它允许在每个模式匹配的替换命令上评估一个表达式,并用该表达式的结果替换匹配的文本。

例如,要将制表符分隔文件中第三列的所有值增加2.1,可以使用以下命令。

:%s/^\%([^\t]*\t\)\{2}\zs[^\t]*/\=str2float(submatch(0))+2.1/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接