複数のファイルで、2つのパターンのいずれかに一致するすべての行を探したいと思います。入力して目的のパターンを見つけようとします。
grep (foo|bar) *.txt
|
ただし、シェルはそれをパイプとして解釈し、bar
実行可能ファイルでない場合は文句を言います。
同じファイルセットで複数のパターンを見つけるためにgrepする方法は?
ベストアンサー1
まず、シェル拡張からパターンを保護する必要があります。最も簡単な方法は一重引用符で囲むことです。一重引用符は、それらの間の内容が拡張されるのを防ぎます(バックスラッシュを含む)。その後、実行できない唯一のことは、パターンに一重引用符を使用することです。
grep -- 'foo*' *.txt
(また、GNUを含むいくつかの実装が呼び出されたファイル(shellで拡張されている)をオプションとして扱うのを--
防ぐために閉じるオプションタグに注意してください(ここではオプションではなく引数を尊重しています)。grep
grep
-foo-.txt
*.txt
'\''
一重引用符が本当に必要な場合(終了文字列リテラル、リテラル引用、オープン文字列リテラル)で作成できます。
grep -- 'foo*'\''bar' *.txt
第二に、grepは少なくとも2つのパターン構文をサポートします。以前の基本構文(基本正規表現)は代替(|
)演算子をサポートしていませんが、一部のバージョンではバックスラッシュで書かれた拡張子として使用されます。
grep -- 'foo\|bar' *.txt
移植可能なアプローチは、最新の構文を使用することです。拡張正規表現。選択-E
するにはオプションを渡す必要があります(以前は別のコマンド²でこれを実行しました)。grep
egrep
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
\|