我正在尝试编写一个简短的脚本,其中我使用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匹配的模式作为参数进行测试.我并没有真正期望上面的工作,但我已经尝试了我能想到的$()括号,反引号和转义的每个组合,并且在任何地方都找不到这种情况.救命?
解决方法:
Sed不会执行命令.但是,Perl将在regex命令上使用/ e选项.
perl -pe 'sub testit { print STDERR "running test"; return @_[0]; }; s/.*(00).*/testit($1)/e' <testfile.txt
如果您不想在线查看并将输出搞砸,请将stderr重定向到/ dev / null.