2つの文字列一致を含む行を削除する

2つの文字列一致を含む行を削除する

次のファイルからdefAND(行2と4)を含むすべての行を削除するにはどうすればよいですか?jklその一致がフィールドの部分文字列一致にも機能するようにしたいと思います。ファイルのフィールドはスペースで区切られます。

$ cat test2.txt 
1. abc def ghi
2. def ghi jkl
3. jkl mno pqr
4. jkl def stu
5. vwx yza bcd

私はブールOR()を使って\|これをしました。

$ sed '/def.*jkl\|jkl.*def/d' test2.txt 
1. abc def ghi
3. jkl mno pqr
5. vwx yza bcd

ANDたとえば、より単純なブール構文がありますか$ sed '/defANDjkl/d'

sed '/def&jkl/d'、、、sed '/def&&jkl/d'としようとしましたが、何も動作しませんsed '/def\&jkl/d'sed '/def\&\&jkl/d'

ベストアンサー1

具体的には、sed次のようにできます。

sed -e '/def/!b' -e /jkl/d

()が見つからない場合、最初のe表現はbオーバーフローします(行を印刷するオプションを渡していないため-n)。見つかると、2番目の要素がオーバーフローします。したがって、最終的には、とが見つかった場合にのみ行が削除されます。def!djkldefjkl

必要な数の正規表現を一般化するには、次のようにします。

sed '
  /regexp1/!b
  /regexp2/!b
  /regexp3/!b
  d'

\|標準語ではありません。基本正規表現(BRE) 演算子。これをサポートする実装はほとんどありませんsed。標準BREにはORまたはAND演算子はありません。標準ERE(拡張正規表現sed -E多くのsed実装がそうであるように)はOR(|)をサポートしますが、ANDはサポートしません。

これ全開実装にはsedAND演算子(&)があります。改善-A正規表現を有効または有効にします-Xが、次のことを行う必要があります。

sed -A '/.*def.*&.*jkl.*/d'

A&Bと両方一致する文字列の一致として。AB

sedPerlに似た正規表現実装(sed -Past-openやsed -Rwithなど)をサポートすることで、ssed予測演算子を使用できます。

sed -P '/^(?=.*def)(?=.*jkl)/d'

(?=...)後に()、任意の数の文字(.*)、その後にdef任意の数の文字の後に()が続く場合、行の先頭に一致しますjkl

grepこれ以上サポートされていない実装がないため、-Psedのようになります。

grep -vP '^(?=.*def)(?=.*jkl)'

携帯性がさらに良くなります。

おすすめ記事