![パターンを含む行と[重複]の前の行を削除してください。](https://linux33.com/image/112061/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E5%90%AB%E3%82%80%E8%A1%8C%E3%81%A8%5B%E9%87%8D%E8%A4%87%5D%E3%81%AE%E5%89%8D%E3%81%AE%E8%A1%8C%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82.png)
ファイルからパターンを含む2行を削除したいですaaa bbb ccc
。
パターンを含む行aaa bbb ccc
とその前の行を削除する次の式を使用しました。
$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'
これは1つのファイルに対して機能します。複数のファイルでは動作しません
$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done
サンプルファイル:
xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh
結果ファイル:
xxx
eee
ggg
hhh
答え1
使っているようですgnu sed
。この場合、次のことができます。
sed -s 'N;/PATTERN/!P;D' ./*.txt
それ以外のsed
場合は、ファイルのリストを繰り返す必要があります。
for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
これはパターンスペースに常に2行を保持し、パターンスペースが一致しない場合は最初の行を印刷するため、入力は次のようになります。
some line
PATTERN
PATTERN
more
lines
another line
PATTERN
それは印刷されます
more
lines