sedで正規表現[0-9]{0,2}が貪欲ではないのはなぜですか?

sedで正規表現[0-9]{0,2}が貪欲ではないのはなぜですか?
echo '123980925sriten34=ienat' | sed -e 's/^.*\?\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/ \1 \2 /'

結果を提供しています:

 4 =

私は期待する:

 34 =

私が理解していないものは何ですか?

+(ああ、そして?確かに追加するまでしましたが、私が知る限り、{0,2}それらがなければ貪欲が多いでしょう。)

ベストアンサー1

質問、スチールドライバーが言ったように[0-9]{0,2}、これは貪欲ではないのか?問題は.*?以前にも欲が多かったということだ。  sed BRE と ERE がサポートされ、どちらも非欲張りな一致をサポートしていません。これがPCREの特徴です。たとえば、次のコマンドは次のようになります。

$ echo 'aQbQc' | sed    's/.*\?Q/X/'
$ echo 'aQbQc' | sed    's/.*Q/X/'
$ echo 'aQbQc' | sed -r 's/.*?Q/X/'
$ echo 'aQbQc' | sed -r 's/.*Q/X/'

すべての出力

Xc

(なぜ無視されるのかわかりません?。)

バラよりSED正規表現と非欲張りな一致(perlのエミュレーション.*?

あなたがやろうとしていることのあなたの説明は表面的ですが、私はそれをリバースエンジニアリングしたと思います。を介してあなたが望む効果を得ることができます。 矛盾一致させたい数字の前の文字を見つけます。

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/! \1 \2 /' -e 's/.*!//'
 34 =

!入力データに表示されないことが知られている文字列に置き換えられます。そのような文字列はありませんが、GNU sedを使用している場合は改行文字を使用できます。

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/\n \1 \2 /' -e 's/.*\n//'
 34 =

もちろんこれは不可能です存在するすべてのライン。

おすすめ記事