リスト内のパターンごとにファイルを読み書きするのは非常に効率が悪いようです。ファイルを一度だけ読み取って処理し、すべての ID を一度に削除することをお勧めします。
これを行う方法は、そのファイルにある ID の種類によって異なりますidlist.txt
。パターンを に渡す方法からするgrep
と、それらは単語または単純な正規表現である必要があるように見えるため、次のアプローチを試すことができます。
まず、ID をsed
プログラムに変換します。
PROGRAM=$(while read ID; do echo "/$ID/{N;d;}"; done < idlist.txt)
次に、使用sed
してプログラムを実行し、ファイルをその場で更新します。
sed -i '' -e "$PROGRAM" -- file1
プログラムが動作する方法は/$ID/
、id を含む行を照合し、コマンドがN
ファイルから次の行を読み取り、d
コマンドが両方の行を削除することです。他の行は正常に印刷されます。$ID
(明らかに、これは、文字を含まない有効な基本正規表現であることに依存し/
ます。)
sed
「拡張正規表現」 (-r
プログラムの GNU バージョンのオプション、またはBSD バージョンのオプション) を受け入れるのバージョンがある場合は-E
、すべての ID を単一の正規表現にコンパイルできます。
PROGRAM=$(printf '/('; tr '\n' '|' < idlist.txt; printf '.^)/{N;d;}')
sed -r -i '' -e "$PROGRAM" -- file1
(.^
これは、一致する可能性がない正規表現です。|
正規表現の final に続いて、代替の final 句からの一致がないことを確認します。)