grepで複数の数字を一致させるために[:digit:]を使用する方法は?

grepで複数の数字を一致させるために[:digit:]を使用する方法は?

最初にgrepを使うのにマニュアルを読んだ後、数字を一致させるために\ dや[0-9]の代わりに[:digit:]を使うことにしました。 grepで実際に数字と一致するのは[[:digit:]]であることがわかりました。二重括弧がある理由を理解しましたが、複数の整数を一致させる方法が見つかりませんでした。

echo 'i100s'|grep -o '[[:digit:]]'

(予想通り) 印刷されます:

1
0
0

しかし、私が試してみると

echo 'i100s'|grep -o '[[:digit:]]+'

または

echo 'i100s'|grep -o '[[:digit:]]{0,3}'

または

echo 'i100s'|grep -o '[[:digit:]]\+'
echo 'i100s'|grep -o '[[:digit:]]\{0,3\}'

何も一致しません。なぜ?

答え1

+演算子は、最も古いgrepバージョン以降のイノベーションです。以前は、+を単一のインスタンスとして表現し、その後に*を使用して同じインスタンスを表現する必要がありました。あまりエレガントではありません。明らかに、範囲演算子も同じカテゴリに属します。検索時に前に\ v(vimの-Eと同じ)を付けない限り、Vimでも同じ問題が発生します。

John1024が指摘したように、Macでは

$echo 'i100s'| grep -Eo '[[:digit:]]+'
100
$echo 'i100s'| egrep -o '[[:digit:]]+'
100

gnu grepに関するドキュメント(Macではhomebrewまたは他のパッケージマネージャを介して利用可能)によると、デフォルトの動作は-F(デフォルトの正規表現の仮定)ですが、john1024が言ったように、私の経験によると、-Eを使用していない間に高度な式をサポートするということです。またはegrep変形。 homebrewを使用してgnu grepをインストールすると便利ですggrepgrepggrep

関連情報