web-dev-qa-db-ja.com

グレップ「OR」正規表現の問題

正規表現で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正規表現が一致しないのはなぜですか?助けてくれてありがとう!

69
dr.bunsen

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

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

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

98
rozcietrzewiacz

複数のブランチ(|orとして使用)を使用する場合は、互換性を高めるために、「モダン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としての直接呼び出しは非推奨です

27
Michał Šrajer