Grep「OR」正規表現の問題


65

正規表現でgrepを使用して、2つの文字列のうち1つに一致するファイル内の行を見つけようとしています。ここに私のgrepがあります:

$ grep "^ID.*(ETS|FBS)" my_file.txt

上記のgrepは結果を返しません。ただし、次のいずれかを実行した場合:

$ grep "^ID.*ETS" my_file.txt  

または

$ grep "^ID.*FBS" my_file.txt  

特定の行に一致します。OR正規表現が一致しないのはなぜですか?助けてくれてありがとう!

回答:


94

通常の正規表現では、文字(|および)エスケープする必要があります。だからあなたは使うべきです

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

拡張正規表現-E)オプションを使用する場合、エスケープは必要ありません。man grepセクション「Basic vs Extended Regular Expressions」を参照してください。


10
egrep代わりに使用することもできますgrep -E
リッカルドムリ

2
@RiccardoMurri Michalの答えは、egrep(およびfgrep)は推奨されないと述べています(まだ機能している場合でも)。
ティモ

27

複数のブランチ(|as or)を使用する場合は、互換性を高めるために、「modern RE」(別名)を使用することを明示的に指定することをお勧めします。ERE。

これを行うには、grep -Eを使用します。

grep -E "^ID.*(ETS|FBS)" my_file.txt

RE、ERE、および「現代の」ERストーリー全体の詳細については、を参照してくださいman 7 regex

または、のegrep代わりに使用できますgrepが、次のように読むことができますman grep

egrepはgrep -Eと同じです。fgrepはgrep -Fと同じです

(...)

egrepまたはfgrepのいずれかとしての直接呼び出しは非推奨です


egrepの直接呼び出しは非推奨ですが、ほとんどの* nixバリアントで機能します。
マークD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.