Le 27 janv. 08 à 10:12, Marc Chantreux a écrit :
On pourrait aussi s'attendre à ce que [\-~] désigne les cars entre 92 et 126, ou bien l'un des 3 car, mais ça prend pas le -
le comportement n'est pas logique, je te l'accorde, mais ca peut s'expliquer: dans un cas tordu comme celui-ci, les seuls caractères du range dont on soit sur sont ceux qui ont été exprimés. c'est bien un range parceque j'utilisateur l'aurait écrit différement sinon ( [- \~]). on garde alors ce que nous avons de sur soir \ et ~. La aussi: UTSL.
On pourrait aussi penser [Z-a] désigne les caractères entre 90 et 97 et ça répond "Invalid range end".
meme raison.
NON, jeune padawan ! Il s'agit de locale. Dans les locales françaises *sous linux*, le A et le a sont dans la même classe de caractère pour le tri, or sed est un programme sensible aux locales, donc sed, en français, voit [Z-a] comme [z-a] ou [z-A] ou [Z-A]. Je dis sous linux, car sous mac OSX (10.5), bien que mon mac me parle frenchy, j'ai pas ce problème de tri (mais j'ai pas de variables LC_* ou LANG* non plus) exemple sous linux en français, A et a sont identique : $ locale LANG=fr LANGUAGE=fr_FR:fr:en_GB:en LC_CTYPE="fr_FR" LC_NUMERIC="fr_FR" LC_TIME="fr_FR" LC_COLLATE="fr_FR" LC_MONETARY="fr_FR" LC_MESSAGES="fr_FR" LC_PAPER="fr_FR" LC_NAME="fr_FR" LC_ADDRESS="fr_FR" LC_TELEPHONE="fr_FR" LC_MEASUREMENT="fr_FR" LC_IDENTIFICATION="fr_FR" LC_ALL=fr_FR $ mkdir TOTO $ cd TOTO $ touch a b c d A B C D Z z $ ls | cat a A b B c C d D z Z $ env LC_ALL=C ls | cat A B C D Z a b c d z et du coup $ ls | sed -e '/[Z-a]/d' sed: -e expression n°1, caractère 7: Fin d'intervalle invalide $ ls | env LC_ALL=C sed -e '/[Z-a]/d' A b B c C d D z quant à [\-~] C'est du délire total en français, par contre, sans traduction, ça marche bien. $ echo 'Aa b- c~ dZ' | env LC_ALL=C sed -e 's/[\-~]//g' A - Z $ echo 'Aa b- c~ dZ' | sed -e 's/[\-~]//g' Aa b- c dZ Un volontaire pour se palucher les codes source de la gnu libc et de sed et expliquer ça ? ;-) Voilà ! Les applications internationalisées obéissent normalement aux variables d'environnement LANG, ou LC_* (LC_COLLATE pour le tri) ou LC_ALL si LC_ALL est définie. Si quelqu'un peut m'expliquer le rôle de la variable LANGUAGE (extension GNU), je suis preneur. Dans le même genre de ç&é"!(çà"!è!è'"§!&"#(!§ç!&"à!ç§&@## en français il y a les nombres à virgule, et pas à point. On se fait tjrs avoir une fois ou deux avec awk (et perl ?) sur des nombres tels 1254.12 tronqués à 1254 car le système attendait, en français, 1254,12 Christophe