Да, это [[:digit:]]~ [0-9]~ \d(где ~ означает приблизительно).
В большинстве языков программирования (где это поддерживается) \d≡ [[:digit:]](идентично). Встречается реже , чем (не в POSIX , но это в GNU ).
\d[[:digit:]]grep -P
В UNICODE много цифр , например:
123456789 # Hindu-Arabic арабские цифры
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Все из которых могут быть включены в [[:digit:]]или \d.
Вместо этого, [0-9]как правило, только цифры ASCII 0123456789.
Существует много языков: Perl, Java, Python, C. На которых [[:digit:]](и \d) требуется расширенное значение. Например, этот код perl будет соответствовать всем цифрам сверху:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Что эквивалентно выбору всех символов, которые имеют свойства Unicode Numericи digits:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Какой grep может воспроизвести (конкретная версия pcre может иметь другой внутренний список числовых кодовых точек, чем Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Измените его на [0-9], чтобы увидеть:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Для конкретного POSIX BRE или ERE: не поддерживается (не в POSIX , но в GNU ).
POSIX требуется для соответствия классу цифр, который, в свою очередь, требуется ISO C для символов от 0 до 9 и ничего больше. Так только в C локали все , , и означают одно и то же. Он не имеет возможных неправильных толкований, доступен в большем количестве утилит, и это обычно означает только . Поддерживается несколькими утилитами.
\dgrep -P[[:digit:]][0-9][0123456789]\d[[:digit:]][0123456789][[:digit:]][0123456789]\d
Что касается [0-9], значение выражений диапазона определяется только POSIX в локали C; в других локалях он может быть другим (может быть порядок кодовых точек или порядок сопоставления или что-то еще).
ракушки
Некоторые реализации могут понимать диапазон как нечто отличное от простого порядка ASCII (например, ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
И это верный источник ошибок, ожидающих своего появления.