私はこの正規表現を持っています:
(?<=prefix).*$
これは、文字列 "prefix"に続く任意の文字を返し、オンラインの正規表現エンジンで正常に機能します(例 https://regex101.com )。問題は、その正規表現をbashで使用する場合です。
grep '(?<=prefix).*$' <<< prefixSTRING
何にも一致しません。なぜその正規表現がgrepで機能しないのですか?
正しい正規表現を定義したようですが、grep
が理解できるようにコマンドラインで十分なフラグを設定していません。デフォルトでは、grep
はBREをサポートし、-E
フラグを指定するとEREを実行するためです。あなたが持っているもの(先読み)は、-P
フラグを指定したGNU grep
でのみサポートされているPCRE正規表現フレーバーでのみ使用できます。
prefix
の後に一致する文字列を抽出するのみする必要があると仮定すると、追加のフラグ-o
を追加して通知する必要がありますgrep
that that printonlymatching part as as
grep -oP '(?<=prefix).*$' <<< prefixSTRING
デフォルトでPCREライブラリをサポートするgrep
のバージョンもあります- pcregrep
だけで実行できます
pcregrep -o '(?<=prefix).*$' <<< prefixSTRING
さまざまな正規表現のフレーバーに関する詳細な説明は、この素晴らしい Gilesの答え と、それぞれを実装するツールで説明されています
正規表現にはさまざまなフレーバーがあります。表示しているのは、Perlに似た正規表現(PCRE、「Perl互換の正規表現」)です。
grep
はPOSIX正規表現を行います。これらは 基本正規表現 (BRE)および 拡張正規表現 (-E
オプションでgrep
が使用されている場合はERE)です。 re_format
またはregex
のマニュアル、またはgrep
マニュアルがシステムで参照している同様のマニュアル、または先ほどリンクしたPOSIX標準テキストを参照してください。
GNU grep
を使用する場合、GNU grep
- specific -P
オプションを指定してgrep
を使用すると、Perlのような正規表現を使用できます。
また、grep
は、デフォルトではlinesを返しますが、行の部分文字列ではありません。繰り返しますが、GNU grep
(およびその他のgrep
の実装)では、-o
オプションを使用して、各行から指定された式に一致するビットのみを取得できます。
-P
と-o
はどちらも非標準の拡張機能であることに注意してください POSIX仕様のgrep
。
GNU grep
を使用していない場合は、代わりにsed
を使用して、文字列prefix
と行の終わりの間のビットを取得できます。
sed -n 's/.*prefix\(.*\)/\1/p' file
これは、sed
が指定された置換を適用するために管理する行のみを出力することです。置換は、式(BRE)に一致する行全体を、文字列prefix
の後に出現する部分で置き換えます。
行にprefix
のインスタンスが複数ある場合、sed
バリエーションはlastの後に文字列を返し、GNU grep
バリエーションは文字列を返します。 firstの後の文字列(prefix
の他のインスタンスが含まれます)。
sed
ソリューションは、すべてのUnixライクなシステムに移植可能です。
他の回答が述べているように、grep
は後読みで正規表現フレーバーを使用しません(デフォルトではGNU grep
、または他のバージョンではまったく使用しません)。 。
GNU grep
またはpcregrep
を使用できない場合は、Perl
があれば使用できます。
Perl
と同等のコマンドラインは次のようになります。
Perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING
スラッシュの間に目的の正規表現を入れます。 Perlを使用しているので、これは Perlの正規表現フレーバー を使用します。