Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

AWK: gsub fct

8 réponses
Avatar
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

8 réponses

Avatar
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.

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
Avatar
Marc Boyer
Le 28-11-2013, Tanguy Ortolo a écrit :
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
Avatar
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'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.
Avatar
Marc Boyer
Le 28-11-2013, Cyrille Lefevre <cyrille.lefevre-news% a écrit :
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
Avatar
Alain Ketterlin
Marc Boyer writes:

Le 28-11-2013, Cyrille Lefevre <cyrille.lefevre-news% nvalid> a écrit :

% 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.
Avatar
Cyrille Lefevre
Le 29/11/2013 08:39, Marc Boyer a écrit :
Le 28-11-2013, Cyrille Lefevre<cyrille.lefevre-news% invalid> a écrit :
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.
Avatar
Cyrille Lefevre
Le 29/11/2013 08:39, Marc Boyer a écrit :
Le 28-11-2013, Cyrille Lefevre<cyrille.lefevre-news% invalid> a écrit :
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.
Avatar
Marc Boyer
Le 02-12-2013, Cyrille Lefevre <cyrille.lefevre-news% a écrit :
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