Comportamento estranho dos intervalos BASH glob / regex
Estou vendo intervalos de suporte BASH (por exemplo, [A-Z]) se comportando de maneira inesperada.
Existe uma explicação para esse comportamento ou é um bug?
Digamos que eu tenho uma variável, da qual quero retirar todas as letras maiúsculas:
$ var='ABCDabcd0123'
$ echo "${var//[A-Z]/}"
O resultado que recebo é o seguinte:
a0123
Se eu fizer isso comsed
, Obtenho um resultado esperado:
$ echo "${var}" | sed 's/[A-Z]//g'
abcd0123
O mesmo parece ser o caso da correspondência de regex interna do BASH:
$ [[ a =~ [A-Z] ]] ; echo $?
1
$ [[ b =~ [A-Z] ]] ; echo $?
0
Se eu marcar todas as letras minúsculas de 'a' a 'z', parece que apenas 'a' é uma exceção:
$ for l in {a..z}; do [[ $l =~ [A-Z] ]] || echo $l; done
a
Não tenho a correspondência sem distinção entre maiúsculas e minúsculas ativada e, mesmo que tenha, não deve fazer com que a letra 'a' se comporte de maneira diferente:
$ shopt -p nocasematch
shopt -u nocasematch
Para referência, estou usando o Cygwin e não vejo esse comportamento em nenhuma outra máquina:
$ 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=
EDITAR:
Encontrei exatamente o mesmo problema relatado aqui:https://bugs.launchpad.net/ubuntu/+source/bash/+bug/120687
Então, acho que é um bug (?) Do agrupamento "en_GB.UTF-8", mas não o BASH propriamente dito.
ConfiguraçãoLC_COLLATE=C
de fato resolve isso.