\ D não é suportado pelas expressões básicas do grep?

119

Isso não gera nenhuma saída. Por quê?

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

Mas estes fazem:

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

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Ankur Agarwal
fonte
2
Nada disso funciona para mim (Solaris).
spraff de
Nem eu. (Cygwin) Você pretendia ter \+? O que isso significa?
Eric Wilson
sim, estou no Ubuntu 10.04, usando o bash. Para o BRE no grep, você precisa escapar alguns caracteres. Tente "Expressões regulares básicas versus estendidas" no man grep.
Ankur Agarwal
2
@FarmBoy: +em uma regex significa "um ou mais token anterior". Nesse caso, é escapado porque essa é a sintaxe exigida pelo grepmecanismo de regex padrão de.
Daenyth de
2
@FarmBoy: +precisa ser escapado se você estiver usando grep; se você estiver usando egrep, não. grep -Eé equivalente a egrep(pelo menos para a versão GNU).
Keith Thompson

Respostas:

196

grepo modo padrão de é (iirc) POSIX regex e \dé pcre. Você pode passar -Ppara gnu grep, para expressões regulares do tipo perl, ou usar em [[:digit:]]vez de \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1
Daenyth
fonte
10
O modo -E do grep BSD inclui \ d. Mas o modo -E do GNU grep não. Isso é tão evidente que estou chocado por estar descobrindo agora.
Keith Tyler
> O modo -E do grep BSD inclui \ d. Mas o modo -E do GNU grep não. Isso é tão evidente que estou chocado por estar descobrindo agora. Isso apenas me pegou em um script de validação de mensagem git commit. Fiquei muito surpreso com o fato de ser o culpado.
austinbruch
18

Tente isto $ echo 'this 1 2 3' | grep '[0-9]\+'

Charles Ma
fonte
1
talvez a opção "grep -E" ajude
bortunac