使用sed删除特定行而不删除具有相同前缀的其他行

时间:2012-11-01 07:15:57

标签: bash shell 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"

所以我有一个测试文件(list1):

line1
line2
line3
line4
line5
line6
@@@
line1_1
line2_1

脚本运行后我最终删除了所有行,因为“line1”和line2“也匹配”line1_1“和”line2_1“

任何帮助都将不胜感激!!

1 个答案:

答案 0 :(得分:1)

如果将sed模式匹配锚定到行的开头和结尾,那么它也不会匹配子串。像这样:

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

(转义'$'用于锚定到行尾,因为它是双引号字符串。)


编辑:那就是说,我觉得你可以用这个单线sed程序替换整个脚本:

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

从文件的开头删除包含'@@@'的第一行,然后删除空白行,并在一次通过中完成所有操作。