grepで正規表現が機能しない


13

私はこの正規表現を持っています:

(?<=prefix).*$

これは、文字列「prefix」に続く任意の文字を返し、オンライン正規表現エンジン(例:https : //regex101.com)で正常に動作します。問題は、bashでその正規表現を使用する場合です。

grep '(?<=prefix).*$' <<< prefixSTRING

何にも一致しません。その正規表現がgrepで機能しないのはなぜですか?


11
これは、regex101がJS、Perl / PHP、およびPythonの場合と同じようにPOSIXフレーバーセレクターを必要とする理由を明らかにしています。私はそれを望んだ回数を数えることはできません。
ジャレッド・スミス


また、は、.*$1文字だけでなく、行末(または文字列の終わり)までの任意の文字列に一致します。
-ilkkachu

回答:


38

正しい正規表現を定義したようですが、それgrepを理解するためにコマンドラインで十分なフラグを設定していません。デフォルトでgrepBREをサポートし、-Eフラグ付きでERE を実行するためです。持っているもの(先読み)はgrep-Pフラグ付きのGNU でのみサポートされているPCRE正規表現フレーバーでのみ使用できます。

余分なフラグを追加して、一致する部分のみを印刷することを通知する必要がある場合に、一致する文字列のみを抽出する必要があると仮定しますprefix-ogrep

grep -oP '(?<=prefix).*$' <<< prefixSTRING

またgrep、デフォルトでPCREライブラリをサポートするバージョンもありpcregrepます。

pcregrep -o '(?<=prefix).*$' <<< prefixSTRING

さまざまな正規表現フレーバーの詳細な説明は、この素晴らしいGilesの回答と、それぞれを実装するツールで説明されています


38

正規表現にはさまざまな種類があります。表示しているのは、Perlに似た正規表現(PCRE、「Perl Compatible Regular Expression」)です。

grepPOSIX正規表現を行います。これらは、基本的な正規表現(BRE)と拡張正規表現(ERE、オプションgrepと一緒に使用する -E場合)です。お使いのシステムでマニュアルが参照しているマニュアル、re_formatまたはregexそれに類するマニュアルgrep、またはリンク先のPOSIX標準テキストを参照してください。

GNUを使用する場合、GNU 固有のオプションgrepを使用するgrepと、Perlのような正規表現を使用できます。grep-P

また、行のサブストリングではなく、デフォルトでgrep返すことに注意してください。繰り返しますが、GNU (およびその他の実装)では、オプションを使用して、各行から指定された式に一致するビットのみを取得できます。grepgrep-o

両方のことに注意してください-Pとは、-o非標準の拡張であるのPOSIX仕様grep

GNUを使用していない場合はgrepsed代わりに使用して、文字列prefixと行末の間のビットを取得できます。

sed -n 's/.*prefix\(.*\)/\1/p' file

これはsed、指定された置換を適用することに成功した行のみを印刷することです。置換は、式(BRE)に一致する行全体を、stringの後にある部分に置き換えますprefix

prefix行に複数のインスタンスがある場合、sedバリエーションは最後grepの文字列の後に文字列を返し、GNU バリエーションは最初の文字列の後に文字列を返します(これにはのその他のインスタンスが含まれますprefix)。

このsedソリューションは、すべてのUnixライクシステムに移植可能です。


6

他の答えが述べているように、greplookbehindsで正規表現フレーバーを使用しない(デフォルトではGNUでgrep、または他のバージョンではまったく使用しない)。

GNU grepまたはを使用できない場合はpcregrep、GNU またはを使用できますperl

と同等のコマンドラインperlは次のようになります。

perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING

スラッシュの間に目的の正規表現を挿入します。Perlを使用しているため、これはPerlの正規表現flavorを使用します


またはprint "$&\n" if ...prefix
ilkkachu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.