1

我有一个包含两个数字的文件

4     4
4      4
9         8
7     7

每行可能有不同数量的空格。我想做的是perldo用来计算两个数字的差异:

我现在正在尝试

:perldo @a=split(/ +/, $_); $_ =  $a[0] - $a[1]

我认为这应该可行,但文件根本没有改变。

如何使用 perldo 做到这一点?

4

5 回答 5

4

要使替换成功,perldo 行必须返回true:如果false返回(或其他“假”值,例如 0),则丢弃更改。

这就是为什么当行中的两个数字相同时,您的代码无法正确更改行:减法的结果为 0,因此结果被丢弃。但是,这有效

:perldo @a=split(/ +/, $_); $_ = $a[0] - $a[1]; 1

我会以不同的方式写它

:perldo s/(\S+)\s+(\S+)/$1-$2/e

但这可能是风格问题。

于 2013-05-21T18:48:35.040 回答
3

我对 perl 了解不多,但是这在这里有效:

:perldo @a=split(/ +/, $_); $_ =  $a[0] - $a[1]; print $_

由于您在 vim 中编辑文件,您可以考虑以 vim 方式进行编辑:

:%s/\v(\d+)\s*(\d+)/\=submatch(2)-submatch(1)
于 2013-05-21T18:40:27.363 回答
3

强制 awk 解决方案

:%!awk '{print $1-$2}'
于 2013-05-21T19:11:42.423 回答
0

壳牌一号线:

perl -ne 'if ( /(\d+)(\s+)(\d+)/ ) { print $1 - $3,":$1-$3\n";}' afile.txt 
于 2013-05-21T19:45:32.373 回答
0

从未听说过 perldo,但 Perl 本身似乎很容易,或者更容易:

perl -lane 'print $F[0]-$F[1]' file.txt > output.txt

或者您可以使用就地编辑

perl -i -lane 'print $F[0]-$F[1]' file.txt 

有备份:

perl -i.bak -lane 'print $F[0]-$F[1]' file.txt 

开关在-a空白处自动拆分,-n开关处理输入(文件/标准输入),-l处理行尾。

于 2013-05-21T21:38:36.910 回答