正規表現で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正規表現が一致しないのはなぜですか?助けてくれてありがとう!
通常の正規表現では、文字(
、|
、)
はエスケープする必要があります。だからあなたは使うべきです
$ grep "^ID.*\(ETS\|FBS\)" my_file.txt
拡張正規表現(-E
)オプションを使用する場合、エスケープは必要ありません。 man grep
、セクション「Basic vs Extended Regular Expressions
」を参照してください。
複数のブランチ(|
を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としての直接呼び出しは非推奨です