а также
у, что диапазоны скобок BASH (например, [A-Z]) ведут себя неожиданно.
Есть ли объяснение такого поведения, или это ошибка?
Допустим, у меня есть переменная, из которой я хочу убрать все заглавные буквы:
$ var='ABCDabcd0123'
$ echo "${var//[A-Z]/}"
В результате я получаю это:
a0123
Если я сделаю это сsed
Я получаю ожидаемый результат:
$ echo "${var}" | sed 's/[A-Z]//g'
abcd0123
То же самое можно сказать и о совпадении регулярных выражений в BASH:
$ [[ a =~ [A-Z] ]] ; echo $?
1
$ [[ b =~ [A-Z] ]] ; echo $?
0
Если я проверяю все строчные буквы от «а» до «z», кажется, что только «а» является исключением:
$ for l in {a..z}; do [[ $l =~ [A-Z] ]] || echo $l; done
a
У меня не включено сопоставление без учета регистра, и даже если бы я это сделал, это не должно заставить букву «а» вести себя иначе:
$ shopt -p nocasematch
shopt -u nocasematch
Для справки, я использую Cygwin, и я не вижу такого поведения на любой другой машине:
$ uname
CYGWIN_NT-6.3
$ bash --version | head -1
GNU bash, version 4.3.46(7)-release (x86_64-unknown-cygwin)
$ locale
LANG=en_GB.UTF-8
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=
РЕДАКТИРОВАТЬ:
Я обнаружил точно такую же проблему, о которой сообщалось здесь:https://bugs.launchpad.net/ubuntu/+source/bash/+bug/120687
Итак, я полагаю, что это ошибка (?) Сопоставления en_GB.UTF-8, но не сама BASH.
настройкаLC_COLLATE=C
действительно решает это.