Sim, é [[:digit:]] ~ [0-9] ~ \d (onde ~ significa aproximada).
Na maioria das linguagens de programação (onde é suportado) \d ≡ [[:digit:]] (identico).
O \d é menos comum que [[:digit:]] (não no POSIX, mas no GNU grep -P ).
Existem muitos dígitos no UNICODE , por exemplo:
123456789 # Hindu-Arabic algarismos arábicos
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT ०१२३४५६७८९ # DEVANAGARI
Todos os podem ser incluídos em [[:digit:]] ou \d .
Em vez disso, [0-9] geralmente é apenas os dígitos ASCII 0123456789 .
Existem muitos idiomas: Perl, Java, Python, C. Em que [[:digit:]] (e \d ) exige um significado estendido. Por exemplo, esse código perl corresponderá a todos os dígitos acima:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Qual é o equivalente a selecionar todos os caracteres com as propriedades Unicode de Numeric e digits :
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Que grep poderia reproduzir (a versão específica do pcre pode ter uma lista interna diferente de pontos de código numérico que Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Altere para [0-9] para ver:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Para o POSIX BRE ou ERE específico:
O \d não é suportado (não no POSIX, mas no GNU grep -P ).
[[:digit:]] é exigido pelo POSIX para corresponder à classe de caractere de dígitos, que por sua vez é requerida pela ISO C para os caracteres de 0 a 9 e nada mais. Portanto, somente na localidade C , todos os [0-9] , [0123456789] , \d e [[:digit:]] significam exatamente o mesmo. O [0123456789] não tem interpretações erradas possíveis, [[:digit:]] está disponível em mais utilitários e é comum significar apenas [0123456789] . O \d é suportado por alguns utilitários.
Quanto a [0-9] , o significado de expressões de intervalo é definido apenas por POSIX na localidade C; em outras localidades, pode ser diferente (pode ser uma ordem codepoint ou ordem de intercalação ou outra coisa).
shells
Algumas implementações podem entender que um intervalo é algo diferente da ordem simples ASCII (ksh93 por exemplo):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
E essa é uma fonte segura de bugs esperando para acontecer.