如何在sed中的\ 1上应用函数?

时间:2011-08-06 16:03:31

标签: bash function sed

如何在sed中使用数字记忆模式应用函数?

简化问题,如下所示:

file.txt的:

130 Some string here
40  Some string here
19  Some string here

script.sh:

#!/bin/bash

function tenmore
{
expr $1 + 10
}

sed -i.backup "s|^\([0-9][0-9]*\)\t\(.*\)|\2\t`tenmore \1`|g" file.txt 

wantedoutput:

Some string here    140
Some string here    50
Some string here    29

我实际上得到了什么:

Some string here    11
Some string here    11
Some string here    11

因此,它将\ 1解释为字符1的转义,并执行超过1(1 + 10 = 11)的函数,而不是超过存储在\ 1中的数值。如何在\ 1?

上应用函数

谢谢。

3 个答案:

答案 0 :(得分:1)

你做不到。在sed程序启动之前,shell中会发生反引号扩展,因此它无法知道\ 1对sed具有特殊含义。

这样的事情是从sed转向更强大工具的好例子,比如Perl:

perl -p -i.backup -e 's/^([0-9][0-9]*)\t(.*)/"$2\t".($1+10)/e'

甚至

perl -p -i.backup -e 's/^(\d+)\t(.*)/"$2\t".($1+10)/e'

(当你的正则表达式仅在行的开头匹配时,/ g修饰符毫无意义)

答案 1 :(得分:1)

awk是正确的工具:

( echo -e "130\tSome string here";
echo -e "40\tSome string here";
echo -e "19\tSome string here" ) | awk -F "\t" '{print $2 "\t" $1+10}'

答案 2 :(得分:0)

如果您不想使用awk,或者不想重写bash函数:

( echo -e "130\tSome string here";
echo -e "40\tSome string here";
echo -e "19\tSome string here" ) | while read v1 v2; do echo -e "$v2\t$(tenmore $v1)"; done