2012-01-04 129 views
2

假設我想要刪除一堆文件中的相同行。我有一個簡單的bash腳本是這樣的:使用sed批量刪除多個文件中的多行

st=$1 
en=$2 
shift 2 
for i in $*; do 
    echo "sed -i -e '${st},${en}d' $i" 
    sed -i -e '${st},${en}d' $i 
done 

我稱之爲是這樣的:

[03:18] ./cleanup.sh 2731 3009 trace_X+0.01080_Y+0.00309_Z-0.00000.dat 

,我得到

sed -i -e '2731,3009d' trace_X+0.01080_Y+0.00309_Z-0.00000.dat 
sed: -e expression #1, char 12: unterminated `s' command 

我在做什麼錯?我試圖在調用語句中的變量或文件名周圍添加更多引號,但沒有運氣...

感謝您的幫助!

+1

順便說一句,'$ *'是錯誤的;在$ @「'中使用'for i。 – 2012-01-05 00:58:52

回答

3

你應該在你的實際sed命令使用雙引號:

sed -i -e "${st},${en}d" $i 

有單引號內沒有變量擴展。

它在擴展回顯中的事實是因爲您回顯的字符串被雙引號包圍。

如果實際上這些只是您處理的數字,您甚至可以完全放棄報價(sed -i -e ${st},${en}d)。

+0

但它確實正確地擴展它,如'echo'調用no的輸出所示? – FrenchKheldar 2012-01-04 21:59:40

+0

好吧,它工作得很好,謝謝你很傻! – FrenchKheldar 2012-01-04 22:01:28

+0

因此,由於外部雙引號引起的echo語句正確擴展? – FrenchKheldar 2012-01-04 22:04:15