これを行う簡単な方法はありますか? grep -v foo file | grep -v bar

egrepを使用してそれを行うにはおそらく非常にエレガントな方法がありますが、単純な古いgrepを使用する方法はありますか?

編集: grep -v "foo\|bar" fileはGNUgrepでのみ機能するようです。私はSolarisを使用しています。そのための解決策はありますか?

コメント

  • 最初の例ではAND一致を実行し、2番目の例ではOR一致を実行しているため、奇妙な質問です。 。結果は、非常に特定の条件でのみ同じになります。
  • そうではありません。 2番目の例では、-vフラグは否定です。 not(A or B) == not(A) and not(B)

回答

複数のテストを通常表示される最初の非オプション引数としてではなく、-e引数を使用して各式を渡すことにより、単一のgrepコマンドを実行します。

$ grep -v -e foo -e bar file 

これは、コマンドと同じことを意味します。「foo」も「bar」も含まないfileからの行を出力します。 。

-vを削除すると、これが完全に逆になることに注意してください。論理演算も変わります! 「foo」または「bar」を含むすべての行を取得します。

回答

grep -Ev "word1|word2"は問題なく動作するはずです

コメント

  • 代わりに、egrepを使用してバックスラッシュを削除することもできます。パイプ文字:egrep -v 'word1|word2
  • これは、Solarisgrepでは機能しないことが判明しました。 GNU grepをインストールして、完全に機能しました。 '質問を編集してSolaris固有にするつもりです。
  • @rahmu \|はGNUgrepです。拡張機能ですが、-E|演算子を使用してポータブルな方法で同じことを実現できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です