次のファイルから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/'
grep
PCREをサポートするGNU:
grep -vP '^(?!.*bar).*foo'
(PCREを使用して負の予測演算子 (?!...)
)。
このうち、perl
このオプションは移植可能な内部編集(perl
すべてのバージョンがインストールされているシステム)でのみ許可されます-i
。
標準はsed
内部編集を行いません。ただし、sed
最近のBSDはこの-i ''
オプションを受け入れ、GNUは拡張機能でsed
それを許可します-i
(両方)。perl
最新バージョンのGNUawk
も許可されています-i inplace
。