input.txt
テキストファイルで2つのパターン(and)が見つかった場合は、テキストstring1
ファイルから1行を削除したい(string2
同じいいですね。を使用してくださいsed
。
努力中です。
sed -i "/\b\(string1\|string2\)\b/d" input.txt
しかし、string1
ORを含む行を削除しています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
埋め込み行で検索するときなど、重複することもありますfoobar
。barbaz
foobarbaz
-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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk '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のコメントは、ブロックの後にコンマが必要であることを除いて、grep
Perlのコメントと似ています。代わりにメソッド呼び出しを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
上記のコードは、foobarbaz
string1とstring2が重なる13行を含む9行から13行を削除します。定義された順序で(重複せずに)表示される文字列を削除する必要がある場合は、Rakuもそうすることができます。
~$ raku -ne '.put unless m/foobar .* barbaz/;' file
上記の9行と10行が削除されました:foobar barbaz
とfoobar foobaz barbaz
。
Raku正規表現の使用に注意してください。できる:overlap
(または)引数/副詞を使用して、:ov
2つの重複する文字列を検出します。以下の最初のリンクをご覧ください。
https://docs.raku.org/言語/regexes#Overlap
https://docs.raku.org/言語/regexes
https://raku.org