2011-06-15 51 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 

注:你必須記得首先導出函數。