2011-06-15 178 views
4

我正在尝试编写一个简短脚本,其中我使用sed来搜索流,然后基于shell函数的结果执行对流的替换,该函数需要参数来自sed,例如在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的匹配的模式被馈送作为参数进行测试。我并没有真正期望上面的工作,但我已经尝试了每个组合的$()方括号,反引号和我能想到的转义,并且在任何地方都找不到这种情况。帮帮我?

+0

如果您使用的是GNU sed,请阅读e命令;)http://www.gnu.org/software/sed/manual/sed.html#Extended-Commands – 2013-02-28 15:27:39

回答

0

试试这个:

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

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

+0

恐怕我没有明白你在这里想做什么,对不起。 – 2011-06-16 23:16:02

1

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

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

如果您不想在线看到它并将输出拧紧,请将stderr重定向到/ dev/null。

+0

也许你是对的。这太令人伤心了,如果只有sed会执行命令,那么很多神奇的事情都可以完成。 – 2011-06-16 23:17:36

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 

注:你必须记得首先导出函数。