web-dev-qa-db-ja.com

grepでのPerl互換正規表現(PCRE)の修飾子の使用

grep --helpおよびman grepによると、パターンをデフォルトの代わりにPerl正規表現(正確にはPCRE)として解釈するために、-Pオプションを使用できます POSIX基本正規表現 (BRE)。

Perl言語では、パターンの解釈を調整するために、さまざまな修飾子​​を式に追加できます(の構文では/pattern/modifiers)。

では、誰かがgrepのPerl正規表現に修飾子を追加するにはどうすればよいですか? grep -P "/^got.it$/ms" [FILE]のようないくつかのバリエーションを試しましたが、検索結果が間違っていました。

ただし、PCREの解釈については、マニュアルで次のように指摘されています。

これは非常に実験的なものであり、grep -Pは実装されていない機能を警告する場合があります。

Grepツールが修飾子をまったくサポートしていない可能性はありますか

ちなみに、修飾子の例である-iオプションを使用すると、大文字と小文字を区別しないパターンマッチングを実行できることに気付きました。

7
Reflection

PCREは文字通りPerlではありません。スタンドアロンのCライブラリlibpcreを使用します。 「PCREスタイル」は、libpcreに依存していなくても、同じ/類似のパターンを使用して正規表現を実装する他の言語を指すために使用されることもあります(grep実際のlibpcreを使用します)。

厳密に言えば、正規表現には実際には修飾子は含まれていません。1 それは単なるパターンです。一部の正規表現インターフェイス(Perlなど)では、パターンとともに修飾子を使用できます。 grepはそうではありません。

パターンのセマンティクスに関しても いくつかの違い があります。繰り返しになりますが、実際にはPerlではなく、それに基づいたものであることに注意してください。


1.実際に パターン内 でない限り、これはgrepで実行できます。例えば。 grep -P "(?i)foobar"は、大文字と小文字を区別しない一致になります。

8
goldilocks