パイプ文字で複数のパターンのパターンを見つけるためにgrepする方法は?

パイプ文字で複数のパターンのパターンを見つけるためにgrepする方法は?

複数のファイルで、2つのパターンのいずれかに一致するすべての行を探したいと思います。入力して目的のパターンを見つけようとします。

grep (foo|bar) *.txt

|ただし、シェルはそれをパイプとして解釈し、bar実行可能ファイルでない場合は文句を言います。

同じファイルセットで複数のパターンを見つけるためにgrepする方法は?

ベストアンサー1

まず、シェル拡張からパターンを保護する必要があります。最も簡単な方法は一重引用符で囲むことです。一重引用符は、それらの間の内容が拡張されるのを防ぎます(バックスラッシュを含む)。その後、実行できない唯一のことは、パターンに一重引用符を使用することです。

grep -- 'foo*' *.txt

(また、GNUを含むいくつかの実装が呼び出されたファイル(shellで拡張されている)をオプションとして扱うのを--防ぐために閉じるオプションタグに注意してください(ここではオプションではなく引数を尊重しています)。grepgrep-foo-.txt*.txt

'\''一重引用符が本当に必要な場合(終了文字列リテラル、リテラル引用、オープン文字列リテラル)で作成できます。

grep -- 'foo*'\''bar' *.txt

第二に、grepは少なくとも2つのパターン構文をサポートします。以前の基本構文(基本正規表現)は代替(|)演算子をサポートしていませんが、一部のバージョンではバックスラッシュで書かれた拡張子として使用されます。

grep -- 'foo\|bar' *.txt

移植可能なアプローチは、最新の構文を使用することです。拡張正規表現。選択-Eするにはオプションを渡す必要があります(以前は別のコマンド²でこれを実行しました)。grepegrep

grep -E -- 'foo|bar' *.txt

複数のパターンのいずれかを探している場合(複雑なパターンを構築するために分離を使用する代わりに)、別の可能性は複数のパターンをに渡すことですgrep。各パターンの前にOperateオプションを追加するだけです-e

grep -e foo -e bar -- *.txt

または、パターンを複数行に配置します。

grep -- 'foo
bar' *.txt

または、これらのパターンを1行に1つずつファイルに保存して実行します。

grep -f that-file -- *.txt

*.txt単一のファイルに拡張する場合、grep複数のファイルがある場合と同様に、一致する行の前にその名前は付けられません。この問題を解決するには、一部のgrep実装(GNUなど)でgrepこのオプションを使用する-Hか、すべての実装で/dev/nullそれを追加の引数として渡すことができます。


一部の実装は、またはをgrep使用してPerlとより互換性のある実装をサポートすることもあります。-P改善kshワイルドカード、-X...-K

egrep²POSIXは廃止され、時には一部のシステムで見つからないがPOSIXまたはGNUユーティリティがインストールされていない他のシステム(Solarisなど)では、または複数行のパターンがサポートされていないため、唯一のオプションegrepです。/bin/grep-e-f-E\|

おすすめ記事