A ordem de intercalaçãoLC_COLLATE define não apenas a ordem de classificação de caracteres individuais, mas também o significado dos intervalos de caracteres. Ou faz? Considere o seguinte snippet:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivamente, Bnão está presente [a-z], portanto, isso não deve gerar nada. É o que acontece no Ubuntu 8.04 ou 10.04. Mas em algumas máquinas rodando Debian Lenny ou aperto, Bé encontrado, porque a gama a-zinclui tudo o que está entre ae zna ordem de agrupamento, incluindo as letras maiúsculas Batravés Z.
Todos os sistemas testados têm o en_UScódigo do idioma gerado. Também tentei variar o código do idioma: nas máquinas com as Bcorrespondências acima, o mesmo acontece em todos os códigos de idioma disponíveis (principalmente com base em latim: {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}também códigos de idioma chinês), exceto no japonês (em qualquer codificação disponível) e C/ POSIX.
O que significam intervalos de caracteres em expressões regulares quando você ultrapassa o ASCII? Por que existe uma diferença entre algumas instalações Debian, por um lado, e outras instalações Debian e Ubuntu, por outro? Como se comportam outros sistemas? Quem está certo e contra quem um bug deve ser relatado?
(Observe que estou perguntando especificamente sobre o comportamento dos intervalos de caracteres, como [a-z]nas en_USlocalidades, principalmente nos sistemas baseados em GNU libc. Não estou perguntando como combinar letras minúsculas ou letras minúsculas ASCII.)
Em duas máquinas Debian, uma onde Bestá [a-z]e outra onde não está, a saída de LC_COLLATE=en_US locale -k LC_COLLATEé
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
e a saída de LC_COLLATE=en_US.utf8 locale -k LC_COLLATEé
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
Cidioma será usado como substituto, e sua ordem de intercalação será de valores de bytes diretos, portanto B, não será correspondida. Teste em um código de idioma que aparece na saída de locale -a.
en_USPorém, não verificou se é gerado.