squeeze + utf8 + grep = meglepetés

Fórumok
mgergi@xx:~$ export LANG=C           ; echo "ab" | grep "[A-Z]"
mgergi@xx:~$ export LANG=en_US       ; echo "ab" | grep "[A-Z]"
mgergi@xx:~$ export LANG=en_US.UTF-8 ; echo "ab" | grep "[A-Z]"
ab
mgergi@xx:~$

Ez meg mi, és miért, és hogyan? Etch és Lenny alatt rendesen működik, és a wheezy-ben is ismét jó.

Ok, ki tudom kerülni, a [[:upper:]] és a perl regexp is jól működik, de miért kell átírni 20 éve működő scripteket? A Linuxos világ nem erről szólt eddig...


mgergi@xx:~$ export LANG=en_US.UTF-8 ; echo "ab" | grep "[[:upper:]]"
mgergi@xx:~$ export LANG=en_US.UTF-8 ; echo "ab" | grep -P "[A-Z]"
mgergi@xx:~$

Hozzászólások

"A Linuxos világ nem erről szólt eddig..."
De. Lasd meg: systemd.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Semmi meglepetés. A bracket-kifejezés mindig is rendezési elemekből állt, következésképpen locale függő. Az

en_US.UTF-8

rendezési locale-kategória (LC_COLLATE) történetesen nem tesz különbséget a kis és nagybetűk között. (Például a

B

és

a

string-eket

a

,

B

sorrendbe rakja, míg a POSIX locale fordítva.) Ennek megfelelően a megadott tartományba a kisbetűk is beleesnek, ezért adódik az illeszkedés. (Egyébként a range expression-ök a POSIX locale-en kívül nincsenek is specifikálva.)

Pontosabban: a bemenetben az "a" és az "A" egyazon collating element-nek felelnek meg, amely collating element-et pedig megadtál a tartományban.

de miért kell átírni 20 éve működő scripteket

Már húsz éve is rosszak (pontatlanok) voltak, de csak most derült ki. Írd ezt a script-ben:

| LC_ALL=POSIX grep "[A-Z]"

(Vagy állítsd át már a script elején a teljes script-re vonatkozóan,

export

-tal.)

"de miért kell átírni 20 éve működő scripteket? A Linuxos világ nem erről szólt eddig..."

"Those who don't understand Unix are condemned to reinvent it, poorly."