1

我正在尝试使用 sed 删除文件的行,但我不想删除这些行,除非搜索字符串完全匹配。IE。

#!/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”

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

4

1 回答 1

1

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

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

(转义用于锚定到行尾的“$”,因为它位于双引号字符串中。)


编辑:也就是说,在我看来,您可以用这个单行 sed 程序替换整个脚本:

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

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

于 2012-11-01T07:21:23.470 回答