在sed脚本中使用命令替换,带参数

时间:2011-06-15 09:09:19

标签: linux sed arguments substitution

我正在尝试编写一个简短的脚本,其中我使用sed搜索流,然后根据shell函数的结果对流执行替换,这需要来自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

(每个之间都有换行符;它们会被您的网站格式化删除)。好吧,这个脚本适合我(输出“运行测试”),但显然没有传递给测试的参数。我希望sed行是这样的:

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

并输出:

running test
00

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

3 个答案:

答案 0 :(得分:1)

Sed不会执行命令。但是,Perl将在regex命令上使用/e选项。

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

如果您不想在线查看并将输出搞砸,请将stderr重定向到/ dev / null。

答案 1 :(得分:1)

这可能对您有用:

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

N.B。您必须记住先导出该功能。

答案 2 :(得分:0)

试试这个:

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

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