2012-11-01 24 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