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
-- Daniel Parler pour ne rien dire ou ne rien dire pour parler sont les deux principes majeurs de tous ceux qui ferait mieux de la fermer avant de l'ouvrir. Pierre Dac
Le 12 mars 2010 11:42, Daniel Caillibaud <ml@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 --- Bapt
Bonjour à tous, Baptiste Daroussin a écrit :
Le 12 mars 2010 11:42, Daniel Caillibaud <ml@lairdutemps.org <mailto:ml@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
Le 12/03/10 à 14:18, Christophe Martin <Christophe.Martin@univ-brest.fr> a écrit :
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 )
Oui, j'avais déjà eu des déboires avec des scripts qui marchaient tout le temps, sauf quand ils marchaient pas, et mis un moment à trouver que c'était une histoire de locale et de séparateur décimal (avec un serveur en fr_FR.UTF8, drôle d'idée), mais pour autant je n'ai pas pensé à ces histoire de variables d'environnement sur des chaînes, surtout sans accents.
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 "$@" }
Merci du tuyau, et hop une ligne de plus dans le bash_aliases. (mais faudra que je me méfie quand j'utilise des machines autres que les miennes) Au fait, une différence entre ta fonction et alias awk='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk' ? En tout cas, ça permet de constater que cette liste a le sommeil long mais extrêmement léger ! -- Daniel Si l'herbe est plus verte dans le jardin de ton voisin, laisse-le s'emmerder à la tondre. Fred Allen
Bonjour à tous, Daniel Caillibaud a écrit :
Le 12/03/10 à 14:18, Christophe Martin <Christophe.Martin@univ-brest.fr> a écrit : [couic]
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 "$@" }
[snip]
Au fait, une différence entre ta fonction et alias awk='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk' ?
J'utilise la fonction dans les scripts où (il me semble que) les alias ne sont pas pris en compte. Sinon pour l'interactif, c'est à peu près égal puisque l'ordre de recherche des commandes est : alias fonction commande interne commande externe J'imagine que c'est une question de goût. /CM
Le 14/03/10 à 11:22, Christophe Martin <Christophe.Martin@univ-brest.fr> a écrit :
J'utilise la fonction dans les scripts où (il me semble que) les alias ne sont pas pris en compte.
Effectivement, j'avais jamais essayé mais je viens de le faire, un alias déclaré dans le script n'est pas pris en compte.
Sinon pour l'interactif, c'est à peu près égal puisque l'ordre de recherche des commandes est : alias fonction commande interne commande externe
J'imagine que c'est une question de goût.
Probablement, pour les scripts je mettrai plutôt AWK='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C /usr/bin/awk' (mais c'est pas forcément super portable, je sais pas si toutes les distribs nux/bsd mettent awk dans /usr/bin) -- Daniel Les allemands sortent la première voiture qui se boit après manger : l'Audi cointreau. Les nuls
Daniel Caillibaud a écrit :
Probablement, pour les scripts je mettrai plutôt
AWK='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C /usr/bin/awk'
(mais c'est pas forcément super portable, je sais pas si toutes les distribs nux/bsd mettent awk dans /usr/bin)
A ma connaissance, les seuls a avoir jamais mis awk dans /bin sont redhat, sur des versions assez anciennes. Je crois qu'ils sont revenus à de meilleures dispositions, mais j'ai pas de redhat pour vérifier. Si quelqu'un peut confirmer... Sinon, tu peux toujours utiliser AWK='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk' et tu laisses la machine trouver awk... /CM
participants (3)
-
Baptiste Daroussin
-
Christophe Martin
-
Daniel Caillibaud