Sì, è [[:digit:]]
~ [0-9]
~ \d
(dove ~ significa approssimativo).
Nella maggior parte dei linguaggi di programmazione (dove è supportato) \d
≡ [[:digit:]]
(identico).
L' \d
è meno comune che [[:digit:]]
(non in POSIX ma è in GNU grep -P
).
Esistono molte cifre in UNICODE , ad esempio:
123456789 # Hindu-Arabic
Numeri arabi
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Tutto ciò può essere incluso in [[:digit:]]
o \d
.
Invece, [0-9]
è generalmente solo le cifre ASCII 0123456789
.
Esistono molte lingue: Perl, Java, Python, C. In cui [[:digit:]]
(e \d
) richiede un significato esteso. Ad esempio, questo codice perl corrisponderà a tutte le cifre dall'alto:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Che equivale a selezionare tutti i caratteri che hanno le proprietà Unicode di Numeric
e digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Quale grep potrebbe riprodurre (la versione specifica di pcre potrebbe avere un elenco interno diverso di punti di codice numerico rispetto a Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Cambialo in [0-9] per vedere:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Per POSIX BRE o ERE specifici:
The \d
non è supportato (non in POSIX ma è in GNU grep -P
).
[[:digit:]]
POSIX deve corrispondere alla classe di caratteri delle cifre, che a sua volta è richiesta da ISO C per essere i caratteri da 0 a 9 e nient'altro. Quindi, solo in versione locale C tutto [0-9]
, [0123456789]
, \d
e [[:digit:]]
dire esattamente la stessa cosa. Non [0123456789]
ha possibili interpretazioni errate, [[:digit:]]
è disponibile in più utility ed è comune significare solo [0123456789]
. Il\d
è supportato da poche utility.
Per quanto riguarda [0-9]
, il significato delle espressioni di intervallo è definito solo da POSIX nella locale C; in altri locali potrebbe essere diverso (potrebbe essere un ordine in codice o un ordine di confronto o qualcos'altro).
conchiglie
Alcune implementazioni potrebbero comprendere un intervallo come qualcosa di diverso dal semplice ordine ASCII (ad esempio ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
E questa è una fonte sicura di bug in attesa di accadere.