最初に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をインストールすると便利ですggrep
。grep
ggrep