如果我有一个包含数字列的数据文件,例如:
3.14
0.42
6.66
在Vim中是否有一种方法可以使用加法、减法和除法等运算来操作这些数字?比如说,我想要在一个列中的每个数字上加2.1,该怎么做呢?
我可以通过将其导入到例如Awk脚本中进行操作,但我想知道是否有内置方法,而我在帮助文件中没有找到相关内容。
如果我有一个包含数字列的数据文件,例如:
3.14
0.42
6.66
在Vim中是否有一种方法可以使用加法、减法和除法等运算来操作这些数字?比如说,我想要在一个列中的每个数字上加2.1,该怎么做呢?
我可以通过将其导入到例如Awk脚本中进行操作,但我想知道是否有内置方法,而我在帮助文件中没有找到相关内容。
ciw<C-R>=<C-R>"*2<CR><Esc>
,但不幸的是它只是用数学计算出来的结果替换了这个单词(这是公平的,因为这就是表达式寄存器计算出来的)。看起来我必须想出某种特殊的绑定,可以自动进行缓冲区写入。 - Steven Luq<任意字母>
,进行你想要记录的操作,按下 q
停止录制,然后按下 q<相同字母>
播放它。 - Kevin表达式寄存器在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.
一个有用的功能,在这种情况下很方便,是使用表达式进行替换(参见:help sub-replace-\=
)。它允许在每个模式匹配的替换命令上评估一个表达式,并用该表达式的结果替换匹配的文本。
例如,要将制表符分隔文件中第三列的所有值增加2.1,可以使用以下命令。
:%s/^\%([^\t]*\t\)\{2}\zs[^\t]*/\=str2float(submatch(0))+2.1/