在一个sed脚本中使用命令replace,使用参数

我正在尝试编写一个简短的脚本,使用sed来searchstream,然后根据shell函数的结果在stream上执行replace,这需要来自sed的参数,例如

#!/bin/sh function test { echo "running test" echo $1 } sed -n -e "s/.*\(00\).*/$(test)/p" < testfile.txt 

其中testfile.txt包含:

 1234 2345 3006 4567 

(在每个之间换行符;它们通过您的网站格式化被删除)。 所以确定脚本适用于我(输出“运行testing”),但显然没有parameter passing给testing。 我想sed行是这样的:

 sed -n -e "s/.*\(00\).*/$(test \1)/p" < testfile.txt 

和输出:

 running test 00 

所以sed匹配的模式被作为一个参数进行testing。 我并没有真正期望上面的工作,但我已经尝试了每个$()方括号,反引号和我能想到的转义的组合,并且在任何地方都找不到这种情况。 帮帮我?

Solutions Collecting From Web of "在一个sed脚本中使用命令replace,使用参数"

Sed不会执行命令。 但是,Perl会在正则表达式中使用/e选项。

 perl -pe 'sub testit { print STDERR "running test"; return @_[0]; }; s/.*(00).*/testit($1)/e' <testfile.txt 

将stderr重定向到/ dev / null,如果你不想看到它在线并搞砸了输出。

这可能适合你:

 tester () { echo "running test"; echo $1; } export -f tester echo -e "1234\n2345\n3006\n4567" | sed -n 's/.*\(00\).*/echo "$(tester \1)"/p' | sh running test 00 

或者如果你使用GNU sed:

 echo -e "1234\n2345\n3006\n4567" | sed -n 's/.*\(00\).*/echo "$(tester \1)"/ep' running test 00 

注意您必须记得先导出函数。

尝试这个:

 sed -n -e "s/.*\(00\).*/$1$2/p" testfile.txt | sh 

注意:我可能有正则表达式错误,但重要的是管道到壳( sh