同じ行に2つのパターンが見つかった場合は、その行を削除してください。

同じ行に2つのパターンが見つかった場合は、その行を削除してください。

input.txtテキストファイルで2つのパターン(and)が見つかった場合は、テキストstring1ファイルから1行を削除したい(string2同じいいですね。を使用してくださいsed

努力中です。 sed -i "/\b\(string1\|string2\)\b/d" input.txtしかし、string1ORを含む行を削除していますstring2

答え1

sed -i "/string1.*string2\|string2.*string1/d" input.txt

これにより、string1がstring2の前に表示されるか、string2がstring1の前に表示されるすべての行が削除されます。行を削除するには、順序に関係なく両方の文字列を行に含める必要があります。

答え2

sed -ie '/string1/!b' -e '/string2/d' file.txt

string1これにより、順序に関係なく、 と の両方を含む行が削除されます。string2埋め込み行で検索するときなど、重複することもありますfoobarbarbazfoobarbaz

-i上記はGNU拡張です。別のGNU関連ソリューション1:

awk -i /usr/share/awk/inplace.awk '!(/string1/ && /string2/)' file.txt

移植可能な場合はperlここで使用できます。

perl -ni -e 'print unless /string1/ && /string2/'

^使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答え3

使用幸せ(以前のPerl_6)

~$ raku -ne '.put unless .match(/ foobar / & / barbaz / ) ;'   file

または

~$ raku -ne '.put unless grep({ / foobar / & / barbaz / }, $_ ) ;'   file

上記は、Rakuを使用してOP操作を実行する2つの一般的な方法です。 Rakuのコメントは、ブロックの後にコンマが必要であることを除いて、grepPerlのコメントと似ています。代わりにメソッド呼び出しをgrep使用することもでき、括弧内に書くことを心配する必要はありません。.grep$_

上記のコード例は、2つの文字列を含む行を削除します。順序と文字列の入れ子にかかわらず。たとえば、

入力例:

1  foo
2  bar
3  baz
4  foobar
5  foobaz
6  barbaz
7  foobar foobaz
8  foobaz barbaz
9  foobar barbaz
10 foobar foobaz barbaz
11 foobaz barbaz foobar
12 barbaz foobar foobaz
13 foobarbaz

出力例(上記のコード例):

1  foo
2  bar
3  baz
4  foobar
5  foobaz
6  barbaz
7  foobar foobaz
8  foobaz barbaz

上記のコードは、foobarbazstring1とstring2が重なる13行を含む9行から13行を削除します。定義された順序で(重複せずに)表示される文字列を削除する必要がある場合は、Rakuもそうすることができます。

~$ raku -ne '.put unless m/foobar .* barbaz/;'  file

上記の9行と10行が削除されました:foobar barbazfoobar foobaz barbaz


Raku正規表現の使用に注意してください。できる:overlap(または)引数/副詞を使用して、:ov2つの重複する文字列を検出します。以下の最初のリンクをご覧ください。


https://docs.raku.org/言語/regexes#Overlap
https://docs.raku.org/言語/regexes
https://raku.org

関連情報