2012-11-01 27 views
1

我想刪除使用sed的文件的行,但我不想刪除這些行,除非搜索字符串完全匹配。即。使用sed刪除特定行而不刪除其他具有相同前綴的行

#!/bin/bash 
set -x 
file="list1" 
index=0 

while read line ; 
    do 
    if [ ! "$line" == "@@@" ]; 
     then 
     MYARRAY[$index]="$line" 
     #index=$(($index+1)) 
     let index++ 
    else 
     break 
    fi 
done < $file 

#echo "MYARRAY is: ${MYARRAY[*]}" 
#echo "The file: ${index}" 

index1=0 
for i in "${MYARRAY[@]}" 
do 
    lineNumber=$((index1 + 1)) 
    sed -i "/${MYARRAY[$index1]}/d" "$file" 
    let index1++ 
done 

sed -i "/@@@/d" "$file" 
#remove empty lines 
sed -i '/^$/d' "$file" 

所以我有一個測試文件(列表1):

line1 
line2 
line3 
line4 
line5 
line6 
@@@ 
line1_1 
line2_1 

和腳本運行後我結束了,因爲「一號線」和2" 號線全部刪除行也匹配‘line1_1’和「line2_1」

任何幫助,將不勝感激!!

回答

1

如果你的錨sed的模式匹配的開始和該行的結束,那麼它會不會也匹配字符串像這樣:

sed -i "/^${MYARRAY[$index1]}\$/d" "$file" 

(逃逸用於錨定到,因爲它是在一個雙引號字符串行末尾的「$」)


編輯:這就是說,它看起來像你對我可以與這一行的sed程序替換整個腳本:

sed '1,/@@@/d; /^$/d' 

從文件的開頭刪除含有「@@@」的第一行,然後還刪除空行,以及所有這一切在一次通過。

+0

很酷 - 謝謝。這只是一個測試腳本,我需要進行行操作,然後只有在這些操作成功時才​​從供稿文件中刪除該行。我不知道該怎麼做,但其目的是將一個標記放入文本文件@@@,然後在該文件中建立一個直到該行的數組,然後執行操作,然後刪除每一行和@@@標記。然後該腳本將再次運行,同時添加到該文件的任何內容。 – ilium007

+0

@ ilium007:啊,現在完全不同了! :-)考慮在開始處理文件時將文件重命名爲臨時名稱,讓它對它進行任何寫入都會創建一個新的空文件,並在完成讀取時刪除臨時文件。仍有競爭條件需要考慮,但這應該更接近可靠的解決方案。 –

+0

很酷,謝謝@ jamey-sharp。現在閱讀比賽條件:) – ilium007