\ dはgrepの基本式ではサポートされていませんか?


119

これは出力を生成しません。どうして?

$ echo 'this 1 2 3' | grep '\d\+'

しかし、これらは行います:

$ echo 'this 1 2 3' | grep '\s\+'
this 1 2 3

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3

2
それらのどれも私(Solaris)のために動作しません。
スプラフ

私もダメ。(シグウィン)持つつもりでした\+か?どういう意味ですか?
Eric Wilson

はい、私はbashを使用してUbuntu 10.04を使用しています。grepのBREでは、一部の文字をエスケープする必要があります。man grepで「基本正規表現と拡張正規表現」を試してください。
Ankur Agarwal 2011

2
@FarmBoy:+正規表現では、「前のトークンの1つ以上」を意味します。この場合、それはエスケープされていますgrep。これは、のデフォルトの正規表現エンジンで必要な構文だからです。
Daenyth、2011

2
@FarmBoy:+を使用している場合はエスケープする必要がありますgrep。を使用している場合は使用egrepしません。 (少なくともGNUバージョンの場合)grep -Eと同等egrepです。
キーストンプソン

回答:


196

grepのデフォルトモードは(iirc)POSIX正規表現で、\dpcreです。-PPerlのような正規表現の場合は、gnu grepに渡すか、の[[:digit:]]代わりに使用できます\d

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1

10
BSD grepの-Eモードには\ dが含まれます。しかし、GNU grepの-Eモードはそうではありません。それは非常に明白で、私は今それを発見しているだけでショックを受けています。
Keith Tyler

> BSD grepの-Eモードには\ dが含まれます。しかし、GNU grepの-Eモードはそうではありません。それは非常に明白で、私は今それを発見しているだけでショックを受けています。これはgit commitメッセージ検証スクリプトに私を噛みました。私は犯人であることにとても驚きました。
austinbruch

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.