fooと一致するがbarと一致しない行をどのように削除できますか?

fooと一致するがbarと一致しない行をどのように削除できますか?

次のファイルから2行目と3行目を削除したいが、4行目(fooと一致するがbarは一致しない行)は削除したくないとします。たとえば、sedを使用してこれを簡単に実行できますか?

text
foo some more text
even more foo text
some foo text with bar

答え1

これは私にとって効果的なようです。

sed '/foo/{/bar/!d;}' my_file

答え2

いくつかの選択肢:

awk '! (/foo/ && !/bar/)'
awk '/bar/ || !/foo/'
sed -e /bar/b -e /foo/d
sed '/foo/{/bar/!d;}'
perl -ne 'print unless /foo/ && !/bar/'

grepPCREをサポートするGNU:

grep -vP '^(?!.*bar).*foo'

(PCREを使用して負の予測演算子 (?!...))。

このうち、perlこのオプションは移植可能な内部編集(perlすべてのバージョンがインストールされているシステム)でのみ許可されます-i

標準はsed内部編集を行いません。ただし、sed最近のBSDはこの-i ''オプションを受け入れ、GNUは拡張機能でsedそれを許可します-i(両方)。perl

最新バージョンのGNUawkも許可されています-i inplace

関連情報