AWK: gsub fct

Le
Marc Boyer
Bonjour à tous,

j'ai une question sur le fonctionnement de gsub dans awk.
L'expression régulière // en substitution me donne '1'.
Ce qui ne correspond pas à ce que fait sed.

% echo ABCD | sed 's/B.*$//'
A
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
A1

Bon, je peux faire faire ce que je veux à awk par

% echo ABCD | awk '{ gsub(/B.*$/,""); print; }'
A

mais c'est moyennement satisfaisant.

Une idée ?

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Tanguy Ortolo
Le #25824412
Marc Boyer, 2013-11-28 10:34+0100:
j'ai une question sur le fonctionnement de gsub dans awk.
L'expression régulière // en substitution me donne '1'.



C'est une chaîne de substitution qu'il faut, pas une expression
régulière.

Ce qui ne correspond pas à ce que fait sed.



Si.

% echo ABCD | sed 's/B.*$//'
A



Tu demandes à sed de remplacer ce qui correspond à l'expression B.*$ par
la chaîne vide. Bien.

% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
A1



Tu demandes à awk de remplacer ce qui correspond à l'expression B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, //, comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de division, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.

Bon, je peux faire faire ce que je veux à awk par

% echo ABCD | awk '{ gsub(/B.*$/,""); print; }'
A

mais c'est moyennement satisfaisant.



Au contraire, c'est bien plus logique et c'est pour ça que ça marche !

--
. o .
. . o Tanguy
o o o
Marc Boyer
Le #25824802
Le 28-11-2013, Tanguy Ortolo
Marc Boyer, 2013-11-28 10:34+0100:
j'ai une question sur le fonctionnement de gsub dans awk.
L'expression régulière // en substitution me donne '1'.



C'est une chaîne de substitution qu'il faut, pas une expression
régulière.



C'est cette info que j'avais raté.

% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
A1



Tu demandes à awk de remplacer ce qui correspond à l'expression B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, //, comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de division, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.



Joies et bonheur des langages à typage, disons, faible.

Merci,
Marc
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Cyrille Lefevre
Le #25826862
Le 28/11/2013 12:17, Tanguy Ortolo a écrit :
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
> A1


Tu demandes à awk de remplacer ce qui correspond à l'expressi on B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, //, comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de divisi on, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.



Bonjour,

ce n'est pas une histoire de division...
//, dans le contexte courant, signifie rechercher une chaine vide sur la
ligne courante, ce qui est vrai => 1

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Marc Boyer
Le #25827162
Le 28-11-2013, Cyrille Lefevre
Le 28/11/2013 12:17, Tanguy Ortolo a écrit :
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
> A1


Tu demandes à awk de remplacer ce qui correspond à l'expression B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, //, comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de division, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.



ce n'est pas une histoire de division...
//, dans le contexte courant, signifie rechercher une chaine vide sur la
ligne courante, ce qui est vrai => 1



Merci de la précision.


Pour ma culture, d'où te viens cette connaissance, ou, formulé
autrement, quelle doc lire pour découvrir ce type d'info ?

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Alain Ketterlin
Le #25827252
Marc Boyer
Le 28-11-2013, Cyrille Lefevre
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
> A1





ce n'est pas une histoire de division...
//, dans le contexte courant, signifie rechercher une chaine vide sur la
ligne courante, ce qui est vrai => 1



Pour ma culture, d'où te viens cette connaissance, ou, formulé
autrement, quelle doc lire pour découvrir ce type d'info ?



Le manuel de awk explique cela :

http://www.gnu.org/software/gawk/manual/html_node/Using-Constant-Regexps.ht ml#Using-Constant-Regexps

"[...] However, regexp constants (such as /foo/) may be used like simple
expressions. When a regexp constant appears by itself, it has the same
meaning as if it appeared in a pattern, i.e., ‘($0 ~ /foo/)†™ [...]"

Je ne sais pas si c'est standard, cela dit.

-- Alain.
Cyrille Lefevre
Le #25836472
Le 29/11/2013 08:39, Marc Boyer a écrit :
Le 28-11-2013, Cyrille Lefevre
Le 28/11/2013 12:17, Tanguy Ortolo a écrit :
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
A1




Tu demandes à awk de remplacer ce qui correspond à l'expres sion B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, // , comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de divi sion, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.



ce n'est pas une histoire de division...
//, dans le contexte courant, signifie rechercher une chaine vide sur la
ligne courante, ce qui est vrai => 1



Merci de la précision.

Pour ma culture, d'où te viens cette connaissance, ou, formulé
autrement, quelle doc lire pour découvrir ce type d'info ?



Bonjour Marc,

20+ ans d'expérience ;)

perso, je préfère le livre original que celui de gnu awk :
gg the awk programming language pdf
=> ok sur books.cat-v.org

pour autant, tous les livres sont bons à lire, dont sed & awk de o'r eilly.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Cyrille Lefevre
Le #25836462
Le 29/11/2013 08:39, Marc Boyer a écrit :
Le 28-11-2013, Cyrille Lefevre
Le 28/11/2013 12:17, Tanguy Ortolo a écrit :
% echo ABCD | awk '{ gsub(/B.*$/,//); print; }'
A1




Tu demandes à awk de remplacer ce qui correspond à l'expres sion B.*$ par
la chaîne //. Problème, qu'est-ce que c'est que ce truc, // , comment awk
va-t-il l'interprêter ? Vu que / est un l'opérateur de divi sion, il est
probable qu'il finisse avec l'entier 1, converti en la chaîne 1.



ce n'est pas une histoire de division...
//, dans le contexte courant, signifie rechercher une chaine vide sur la
ligne courante, ce qui est vrai => 1



Merci de la précision.

Pour ma culture, d'où te viens cette connaissance, ou, formulé
autrement, quelle doc lire pour découvrir ce type d'info ?



Bonjour Marc,

20+ ans d'expérience ;)

perso, je préfère le livre original que celui de gnu awk :
gg the awk programming language pdf
=> ok sur books.cat-v.org

pour autant, tous les livres sont bons à lire, dont sed & awk de o'r eilly.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Marc Boyer
Le #25836812
Le 02-12-2013, Cyrille Lefevre
perso, je préfère le livre original que celui de gnu awk :
gg the awk programming language pdf
=> ok sur books.cat-v.org



Je l'envois tout de suite à l'impression.

pour autant, tous les livres sont bons à lire, dont sed & awk de o'reilly.



Celui là, je l'ai déjà, et je l'ouvre souvent...

Merci,
Marc Boyerr
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Publicité
Poster une réponse
Anonyme