如何用匹配数计算

时间:2018-05-03 20:28:46

标签: perl

我有一个文件,其中每一行以整数开头,我想从每个数字中减去2,以便例如。

2 foo
2 bar
3 foo
3 bar

变为

0 foo
0 bar
1 foo
1 bar

我试过

perl -pe 's/^(\d+)/($1 - 2)/g' file   #-> '(2 - 2) foo'...
perl -pe 's/^(\d+)/add($1, -2)/g' file #-> 'add(2, -2) foo'...

两者都不适合我。我已经读过Perl会根据我使用它们的上下文将字符串解释为数字,但我似乎无法明确表达我的意图。

2 个答案:

答案 0 :(得分:5)

您需要使用e修饰符 e 将右侧评估为表达式:

perl -pe 's/^(\d+)/$1 - 2/ge' file

我还减去2得到你想要的输出。

请参阅perlop

答案 1 :(得分:1)

另一种方法。

perl -lane '$F[0] -= 2 if $F[0] =~ /^\d+$/; print "@F"' file

此外,您每行只进行一次替换,这是通过匹配^ - 字符串开头(不使用// m)强制执行,并且不需要' g&#39 ;修饰符 - 所以也许s/^(\d+)\b/$1-2/e

感谢peer澄清了示例数据中似乎是领先空间的内容。