パターン C または D が含まれていない場合は、パターン A または B で始まる行を削除します。

パターン C または D が含まれていない場合は、パターン A または B で始まる行を削除します。

次のファイルがあります。

1 foo
1 bar
1 someOtherString
2 contains bar and more
2 test
3 contains a random string
4 some other string
2 don't remove this line bar
2 but remove this line
14 keep this line
21 and also this line
7 bar

このファイルから次のファイルをインポートしたいと思います。

1 foo
1 bar
2 contains bar and more
3 contains a random string
4 some other string
2 don't remove this line bar
14 keep this line
21 and also this line
7 bar

オリジナル:

  • 「1」または「2」で始まらない行をすべて保持します。
  • 「foo」または「bar」を含むすべての行を保持します。
  • 他のすべての行を削除
  • 注文をそのままにしてください

ベストアンサー1

というファイルのデータを考慮してくださいfile。例の結果を得るための要件は、公開した説明とは少し異なります。

  • file次のいずれかの条件に一致するすべての行を保持します。
    • nor(数字の後にスペースがある)で1 始めないでください。2
    • 含めるfoobar
  • 他のすべての行を削除
  • 注文をそのままにしてください

perlこれは、2つの式を一致させ、一致するときにその行を(順番に)印刷することによって表現できます。

perl -ne '( !/^(1 |2 )/ or /foo|bar/ ) and print' file

振り返ってみると、要件全体がわずかに異なるように表現されている可能性があります。

  • 各行ごとに順番に
    • 1 行がまたはで始まらない場合は、その行を印刷します。2
    • fooまたはbar

これはawk非常に便利にマッピングされます。

awk '!/^(1 |2 )/ || /foo/ || /bar/' file

どちらの場合でも、REは共通の要因を導き、次のようperlに書き直すことで単純化できます。awk^(1 |2 )^[12]

perl -ne '( !/^[12] / or /foo|bar/ ) and print' file
awk '!/^[12] / || /foo/ || /bar/' file

おすすめ記事