expressions sed

Christophe Martin Christophe.Martin at univ-brest.fr
Mon Jan 28 10:43:58 CET 2008


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


More information about the Shell mailing list