如何在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?
上应用函数谢谢。
答案 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