1

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」に一致するため、すべての行が削除されます

どんな助けでも大歓迎です!!

4

1 に答える 1

1

sed パターンの一致を行の最初と最後に固定すると、部分文字列にも一致しなくなります。そのようです:

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

(二重引用符で囲まれた文字列であるため、行末にアンカーするために使用される「$」をエスケープします。)


編集:そうは言っても、スクリプト全体をこの1行のsedプログラムに置き換えることができるように思えます:

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

これは、ファイルの先頭から「@@@」を含む最初の行までを削除し、次に空白行も削除し、すべてを 1 回のパスで行います。

于 2012-11-01T07:21:23.470 に答える