web-dev-qa-db-ja.com

Cygwinのgrepでregex ORを使用するには?

1つのファイルから2つの異なる一致の結果を返す必要があります。

grep "string1" my.file

my.fileのstring1の単一インスタンスを正しく返します

grep "string2" my.file

my.fileのstring2の単一インスタンスを正しく返します

しかし

grep "string1|string2" my.file

何も返さない

正規表現テストアプリでは構文が正しいので、cygwinのgrepで機能しないのはなぜですか?

52
rob

基本的な正規表現でエスケープせずに|文字を使用すると、|リテラルのみが一致します。たとえば、内容のあるファイルがある場合

string1
string2
string1|string2

grep "string1|string2" my.fileを使用すると、最後の行のみが一致します

$ grep "string1|string2" my.file
string1|string2

代替演算子|を使用するには、次のようにします。

  1. 基本的な正規表現(ちょうどgrep)を使用し、正規表現の|文字をエスケープします

    grep "string1\|string2" my.file

  2. Julianが his answer で既に指摘したように、egrepまたはgrep -Eで拡張正規表現を使用します

    grep -E "string1|string2" my.file

  3. 照合するパターンが2つある場合は、-eオプションでそれらを個別に指定することもできます。

    grep -e "string1" -e "string2" my.file

grepリファレンスの次のセクションが役立つ場合があります。

77
Xavi López

egrepまたはgrep -Eを使用する必要がある場合があります。パイプORシンボルは「拡張」grepの一部であり、基本的なCygwin grepではサポートされない場合があります。

また、おそらくパイプ記号をエスケープする必要があります。

10
Julian

私が見つけた最良かつ最も明確な方法は次のとおりです:grep -e REG1 -e REG2 -e REG _FILETOGREP_

パイプを使用することはあまりありませんが、作業するのは非常に厄介です。

6
Travis

この情報は、「man grep」を実行することで見つけることができるgrep(1)というすばらしいマニュアルを読むことで見つけることができます。 grepとegrepの違い、基本的な表現と正規表現、およびgrepに関するその他の多くの有用な情報について説明します。

0
Andrew Schulman