Je viens de m'apercevoir d'une mise à jour de cpp sur certains de
mes système (qui met la pagaille dans un soft que j'ai écrit il y a
quelques années...).
En gros, j'ai des scripts qui utilisent les directives du
préprocesseur (#include, #if/#else/#endif et c'est à peu près tout)
_et_ les commentaires façon C++, à savoir // et /*....*/. J'ai aussi
mes propres objets qui peuvent commencer par # (mais pas en première
colonne). Aujourd'hui, le cpp livré avec gcc récupère les objets
commençant par # en début de ligne (mais pas en première colonne)
comme des directives s'adressant à lui. Comme il ne les reconnaît
pas, il les vire du script et la suite se passe mal...
J'essaye donc d'écrire un script tout bête recherchant les
caractères # précédés d'au moins un espace ou une tabulation et de
rien d'autre (je sais faire avec sed) et de concaténer cette ligne
avec la ligne précédente (je ne sais plus faire, pourtant j'ai
rtfmer sed). Une idée (avec sed ou awk) ? Cela doit rentrer dans le
script suivant :
J'ai essayé une autre solution : appeler cpp avec --traditional-cpp,
mais je n'ai plus les commentaires façon C++ (//). Une autre piste
serait de repérer tous les // en dehors des chaînes de caractères
pour les remplacer par des /*...*/, mais ça me semble beaucoup plus
compliquer (il faut avoir un drapeau pour savoir si on est ou non
dans une chaîne de caractères...).
[...] J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
sed -n '# aucun objet en 1ère ligne 1{h;b} /^[ t]+#/{H;b} x;s/n//g;p ${x;p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ? -- Jacques L'helgoualc'h
Dans l'article <slrncsdpfj.5gb.knatschke@rayleigh.systella.fr>,
Bonjour à tous,
bonjour.
[...]
J'essaye donc d'écrire un script tout bête recherchant les
caractères # précédés d'au moins un espace ou une tabulation et de
rien d'autre (je sais faire avec sed) et de concaténer cette ligne
avec la ligne précédente (je ne sais plus faire, pourtant j'ai
rtfmer sed).
sed -n '# aucun objet en 1ère ligne
1{h;b}
/^[ t]+#/{H;b}
x;s/n//g;p
${x;p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ?
--
Jacques L'helgoualc'h
[...] J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
sed -n '# aucun objet en 1ère ligne 1{h;b} /^[ t]+#/{H;b} x;s/n//g;p ${x;p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ? -- Jacques L'helgoualc'h
Jacques L'helgoualc'h
Dans l'article ,
Bonjour à tous,
bonjour.
[...] J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
sed -n '# aucun objet en 1ère ligne 1{h;b} /^[ t]+#/{H;$!b} x;s/n//g;p ${x;/^[ t]+#/!p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ? -- Jacques L'helgoualc'h
Dans l'article <slrncsdpfj.5gb.knatschke@rayleigh.systella.fr>,
Bonjour à tous,
bonjour.
[...]
J'essaye donc d'écrire un script tout bête recherchant les
caractères # précédés d'au moins un espace ou une tabulation et de
rien d'autre (je sais faire avec sed) et de concaténer cette ligne
avec la ligne précédente (je ne sais plus faire, pourtant j'ai
rtfmer sed).
sed -n '# aucun objet en 1ère ligne
1{h;b}
/^[ t]+#/{H;$!b}
x;s/n//g;p
${x;/^[ t]+#/!p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ?
--
Jacques L'helgoualc'h
[...] J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
sed -n '# aucun objet en 1ère ligne 1{h;b} /^[ t]+#/{H;$!b} x;s/n//g;p ${x;/^[ t]+#/!p}'
mais les #objets peuvent se retrouver dans un // commentaire ...
Qu'arrive-t-il avec /* bla */ #objet ? -- Jacques L'helgoualc'h
Contrairement à gawk, mawk ne connaît pas [:blank:] => [ t]. -- Jacques L'helgoualc'h
cedric
JKB wrote:
J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
Ca vaut ce que ca vaut, mais avec certain sed il est possible de matcher un caractere newline avec n. Ceci dis, encore faut-il que ce caractere se retrouve dans le pattern. Pour ca, on trouve sur google un 'truc' accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g'
Ce qui signifie :
:a <- label "a" N <- ajoute la ligne suivante au pattern en cours $! <- Si pas la dernière ligne... ba <- Alors saute à "a" s/n[ t]#//g <- sinon, dans le pattern, remplacer ce qui va pas par ce qui va bien.
Le danger, c'est que sed va se faire une énorme ligne, et il risque l'overdose.
Tu tiens vraiment à utiliser sed ?
JKB wrote:
J'essaye donc d'écrire un script tout bête recherchant les
caractères # précédés d'au moins un espace ou une tabulation et de
rien d'autre (je sais faire avec sed) et de concaténer cette ligne
avec la ligne précédente (je ne sais plus faire, pourtant j'ai
rtfmer sed).
Ca vaut ce que ca vaut, mais avec certain sed il est possible de matcher
un caractere newline avec n. Ceci dis, encore faut-il que ce caractere
se retrouve dans le pattern. Pour ca, on trouve sur google un 'truc'
accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g'
Ce qui signifie :
:a <- label "a"
N <- ajoute la ligne suivante au pattern en cours
$! <- Si pas la dernière ligne...
ba <- Alors saute à "a"
s/n[ t]#//g <- sinon, dans le pattern, remplacer ce qui va pas par ce
qui va bien.
Le danger, c'est que sed va se faire une énorme ligne, et il risque
l'overdose.
J'essaye donc d'écrire un script tout bête recherchant les caractères # précédés d'au moins un espace ou une tabulation et de rien d'autre (je sais faire avec sed) et de concaténer cette ligne avec la ligne précédente (je ne sais plus faire, pourtant j'ai rtfmer sed).
Ca vaut ce que ca vaut, mais avec certain sed il est possible de matcher un caractere newline avec n. Ceci dis, encore faut-il que ce caractere se retrouve dans le pattern. Pour ca, on trouve sur google un 'truc' accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g'
Ce qui signifie :
:a <- label "a" N <- ajoute la ligne suivante au pattern en cours $! <- Si pas la dernière ligne... ba <- Alors saute à "a" s/n[ t]#//g <- sinon, dans le pattern, remplacer ce qui va pas par ce qui va bien.
Le danger, c'est que sed va se faire une énorme ligne, et il risque l'overdose.
Contrairement à gawk, mawk ne connaît pas [:blank:] => [ t].
Ca pourrait donc etre un bug. Dans ma page de man de mawk, j'ai:
mawk conforms to the Posix 1003.2 (draft 11.3) definition of the AWK language.
Et je serais etonné que cette version de POSIX ne parle pas des "POSIX character classes".
-- Stephane
Stephane Chazelas
2004-12-20, 18:21(+01), cedric: [...]
Pour ca, on trouve sur google un 'truc' accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g' [...]
Pas POSIX. Les intructions qui prennent des labels et w et r et } ne doivent pas avoir des trucs qui les suivent. t n'est pas garantit d'etre reconnu.
sed -e :a -e 'N;$!ba' -e 's/n([[:blank:]]#)/1/g'
POSIX ne garantit pas que ca marchera pour des fichiers gros de plus de 8192 octets. La solution awk que je donnais n'a de limitation que sur la longueur des lignes (POSIX garantit 2048).
perl -0777 -pe 's/n(s#)/$1/g'
devrait marcher sans limitations.
-- Stephane
2004-12-20, 18:21(+01), cedric:
[...]
Pour ca, on trouve sur google un 'truc'
accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g'
[...]
Pas POSIX. Les intructions qui prennent des labels et w et r et
} ne doivent pas avoir des trucs qui les suivent. t n'est pas
garantit d'etre reconnu.
sed -e :a -e 'N;$!ba' -e 's/n([[:blank:]]#)/1/g'
POSIX ne garantit pas que ca marchera pour des fichiers gros de
plus de 8192 octets. La solution awk que je donnais n'a de
limitation que sur la longueur des lignes (POSIX garantit 2048).
Pour ca, on trouve sur google un 'truc' accablant de malice :
sed ':a;N;$!ba;s/n[ t]#//g' [...]
Pas POSIX. Les intructions qui prennent des labels et w et r et } ne doivent pas avoir des trucs qui les suivent. t n'est pas garantit d'etre reconnu.
sed -e :a -e 'N;$!ba' -e 's/n([[:blank:]]#)/1/g'
POSIX ne garantit pas que ca marchera pour des fichiers gros de plus de 8192 octets. La solution awk que je donnais n'a de limitation que sur la longueur des lignes (POSIX garantit 2048).
perl -0777 -pe 's/n(s#)/$1/g'
devrait marcher sans limitations.
-- Stephane
Jacques L'helgoualc'h
Dans l'article ,
2004-12-20, 17:13(+00), Jacques L'helgoualc'h:
[...] mawk ne connaît pas [:blank:] => [ t].
Ca pourrait donc etre un bug.
Ce n'est pas ça qui manque, cf. http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=mawk
Dans ma page de man de mawk, j'ai:
mawk conforms to the Posix 1003.2 (draft 11.3) definition of the AWK language.
Pareil.
Et je serais etonné que cette version de POSIX ne parle pas des "POSIX character classes".
Bon, ce mawk n'est pas très frais
$ awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits: max NF 32767 sprintf buffer 1020
Le hic, c'est qu'il est "required" dans Debian (woody) ; gawk n'y est qu'optionnel. Bon, dans le Changelog unstable :
* debian/postinst: demote mawk to priority 5 so that gawk will be selected by default. [mawk isn't being actively maintained upstream and has both long-standing bugs and isn't feature-complete WRT POSIX at least.]
-- Jacques L'helgoualc'h
Dans l'article <slrncse34q.mua.stephane.chazelas@spam.is.invalid>,
2004-12-20, 17:13(+00), Jacques L'helgoualc'h:
[...] mawk ne connaît pas [:blank:] => [ t].
Ca pourrait donc etre un bug.
Ce n'est pas ça qui manque, cf.
http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=mawk
Dans ma page de man de mawk, j'ai:
mawk conforms to the Posix 1003.2 (draft 11.3) definition of the
AWK language.
Pareil.
Et je serais etonné que cette version de POSIX ne parle pas des
"POSIX character classes".
Bon, ce mawk n'est pas très frais
$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 1020
Le hic, c'est qu'il est "required" dans Debian (woody) ; gawk n'y est
qu'optionnel. Bon, dans le Changelog unstable :
* debian/postinst: demote mawk to priority 5 so that gawk will be
selected by default. [mawk isn't being actively maintained upstream
and has both long-standing bugs and isn't feature-complete WRT POSIX
at least.]
Ce n'est pas ça qui manque, cf. http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=mawk
Dans ma page de man de mawk, j'ai:
mawk conforms to the Posix 1003.2 (draft 11.3) definition of the AWK language.
Pareil.
Et je serais etonné que cette version de POSIX ne parle pas des "POSIX character classes".
Bon, ce mawk n'est pas très frais
$ awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits: max NF 32767 sprintf buffer 1020
Le hic, c'est qu'il est "required" dans Debian (woody) ; gawk n'y est qu'optionnel. Bon, dans le Changelog unstable :
* debian/postinst: demote mawk to priority 5 so that gawk will be selected by default. [mawk isn't being actively maintained upstream and has both long-standing bugs and isn't feature-complete WRT POSIX at least.]
-- Jacques L'helgoualc'h
Stephane Chazelas
2004-12-20, 18:14(+00), Jacques L'helgoualc'h: [...]
Le hic, c'est qu'il est "required" dans Debian (woody) ; gawk n'y est qu'optionnel. Bon, dans le Changelog unstable : [...]
Note que gawk a aussi des problemes de compatibilité POSIX.
awk '/a{3}/'
ne marche pas a moins de passer l'option -W posix.
Ce qui fait qu'un script
#! /usr/bin/awk -f /a{3}/
ne marchera pas.
-- Stephane
2004-12-20, 18:14(+00), Jacques L'helgoualc'h:
[...]
Le hic, c'est qu'il est "required" dans Debian (woody) ; gawk n'y est
qu'optionnel. Bon, dans le Changelog unstable :
[...]
Note que gawk a aussi des problemes de compatibilité POSIX.
awk '/a{3}/'
ne marche pas a moins de passer l'option -W posix.