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 =
もちろんこれは不可能です存在するすべてのライン。