2010-11-17 35 views
1

什麼,我想做一個簡單的例子更換:複雜的文本命令行

我有一個文件:input.txt中,它看起來像

a 2 4 b 
a 3 8 b 
c 9 4 d 
a 3 4 8 b 

和腳本:add.sh這需要命令行參數並返回它們的總和

我想爲input.txt搜索模式'a (.*) b'的所有實例,其中我將(。*)部分作爲命令行參數傳遞給add.sh.

例如,我想要做一些類似sed 's/a \(.*\) b/a {add.sh \1} b/g' input.txt (當然不起作用)。 所以輸出應該看起來像

a 6 b 
a 11 b 
c 9 4 d 
a 15 b 

什麼是做到這一點的最簡單的方法?

感謝

回答

0
perl -pe 's/a (.*) b/"a ".`add.sh $1`." b"/eg' input.txt 

只要確保add.sh不輸出換行符。

0

如果Perl是不是一種選擇,你可以 腳本它是這樣的:

grep -e '^a .* b$' input.txt | sed -e 's/a \(.*\) b/\1/g' | while read LINE; do ./add.sh $LINE; done 

我意識到上面沒有解決您的問題,我只是專注於您的sed表達。

但是,如果你是熱衷於解決在使用另一個shell腳本這個問題的話,大概是這個樣子:

cat input.txt | while read LINE; do 
    if [[ "$LINE" =~ ^a (.*) b$ ]]; then 
     echo -n "a " 
     add.sh ${BASH_REMATCH[1]} 
     echo " b" 
    else 
     echo $LINE 
    fi 
done 
0

如果add.sh是:

#!/bin/sh 
arg1=$1 
nums=$2 
shift 2 
for i in $nums 
do 
    sum=$((sum+i)) 
done 
echo "$arg1 $sum [email protected]" 

,那麼你可以這樣做:

sed 's/^\([^ ]* \)\(.*\)\([^ ]*\)$/\1\"\2\"\3/' input.txt | xargs -L 1 ./add.sh 

這將在每一行添加數字。只爲與「a」和以「b」結束開始的行添加它們使用此:

sed 's/^a \(.*\) b$/a \"\1\" b/' input.txt | xargs -L 1 ./add.sh 

的「C 9 4 d」行仍由add.sh處理但sed命令不添加任何引號,所以腳本只看到「9」爲$2,所以總和只做一次,結果爲「9」。 「4」被視爲[email protected]的其餘部分。