filtre [a-z] avec awk

Christophe Martin Christophe.Martin at univ-brest.fr
Fri Mar 12 14:18:12 CET 2010


Bonjour à tous,

Baptiste Daroussin a écrit :
> 
> 
> Le 12 mars 2010 11:42, Daniel Caillibaud <ml at lairdutemps.org 
> <mailto:ml at lairdutemps.org>> a écrit :
> 
>     Bonjour,
> 
>     Si y'a toujours un peu de lumière par ici, j'ai une question bête de
>     regex
> 
>     Pourquoi la 1re ligne, avec une majuscule, sort quand même avec awk
>     (alors que sed donne le comportement que j'attendais) ?
> 
>     $ echo 'Un test
>      > avec une autre ligne' |awk '/^[a-z ]+$/ {print $0}'
>     Un test
>     avec une autre ligne
> 
>     $ echo 'Un Test
>      > avec une autre ligne' |sed -nre '/^[a-z ]+$/ p'
>     avec une autre ligne
> 
> 
> Tout simplement parce qu'il semble soit s'agir encore d'un bug gnu awk 
> soit d'une fonctionnalité/extension GNU awk parce que ça marche 
> parfaitement comme attendu (cad comme avec ton sed) en utilisant nawk.
> 
> 
> Je pencherai pour le bug parce que :
> 
> résultat foireux en gawk 3.1.5 sous linux
> 
> résultat correct avec gawk 3.1.6, mawk 1.3.3 et nawk (celui de base) 
> 20070501 sous freebsd
> 

À cause des regles de collation en français ? ou les minuscules et les 
majuscules ont le même rang.

exple :
touch a A b B
env LANGUAGE=fr_FR.UTF-8 LANG=fr_FR.UTF-8 ls -l a b A B
-rw-r--r-- 1 cmartin mrg 0 2010-03-12 13:57 a
-rw-r--r-- 1 cmartin mrg 0 2010-03-12 13:57 A
-rw-r--r-- 1 cmartin mrg 0 2010-03-12 13:57 b
-rw-r--r-- 1 cmartin mrg 0 2010-03-12 13:57 B

env LANGUAGE=C LANG=C ls -l a b A B
-rw-r--r-- 1 cmartin mrg 0 Mar 12 13:57 A
-rw-r--r-- 1 cmartin mrg 0 Mar 12 13:57 B
-rw-r--r-- 1 cmartin mrg 0 Mar 12 13:57 a
-rw-r--r-- 1 cmartin mrg 0 Mar 12 13:57 b


de la même manière :

echo 'Un test
une autre ligne' | env LANGUAGE=fr_FR.UTF-8 LANG=fr_FR.UTF-8 awk '/^[a-z]/'
Un test
une autre ligne

echo 'Un test
une autre ligne' | env LANGUAGE=C LANG=C awk '/^[a-z]/'
une autre ligne

La prise en compte des réglages internationnaux est-elle correcte ou 
buggée (ou pourquoi pas totalement idiote) ? Je n'arrive pas vraiment à 
me décider (encore que je penche pour la dernière solution)

De toutes les façons, travailler avec des réglages de langue autre que C 
avec awk c'est courir au suicide (voir aussi 
http://cli.asyd.net/home/filtres/awk/presentation#langage_awk )

perso, quand je fais du awk, j'utilise tjrs une fonction shell du genre:

Awk() {
	env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk "$@"
}

/cm


More information about the Shell mailing list