Sed et variable

Le
Marc Boyer
Bonjour,

je suis en train de faire un script sed, et j'aurais besoin
de macros.

J'ai des sous-expressions qui reviennent souvent, et plutôt
que de truffer mes expressions de
(?[+-]?[0-9/])?
je voudrais écrire plutôt
${rat}
avec quelque part
rat=(?[+-]?[0-9/])?

Une idée ? Générer mon fichier sed à partir d'un autre fichier sed ?
Passer à perl ?

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
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
Cyrille Lefevre
Le #21682391
Le 04/05/2010 13:38, Marc Boyer a écrit :
Bonjour,

je suis en train de faire un script sed, et j'aurais besoin
de macros.

J'ai des sous-expressions qui reviennent souvent, et plutôt
que de truffer mes expressions de
(?[+-]?[0-9/])?
je voudrais écrire plutôt
${rat}
avec quelque part
rat=(?[+-]?[0-9/])?

Une idée ? Générer mon fichier sed à partir d'un au tre fichier sed ?



Bonjour,

il est toujours possible de faire sed "..." plutôt que sed '...'
auquel cas, tu peux mettre tes expressions rationnelles sous forme
de variables au niveau shell. là ou ça se complique, c'est pour les ...
alternative, awk ?
awk -v q="'" '
BEGIN { rat="(?[+-]?[0-9/])?" }
$0 ~ rat { ...; next }
...
'

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Marc Boyer
Le #21684381
Cyrille Lefevre
Le 04/05/2010 13:38, Marc Boyer a écrit :
Bonjour,

je suis en train de faire un script sed, et j'aurais besoin
de macros.

J'ai des sous-expressions qui reviennent souvent, et plutôt
que de truffer mes expressions de
(?[+-]?[0-9/])?
je voudrais écrire plutôt
${rat}
avec quelque part
rat=(?[+-]?[0-9/])?

Une idée ? Générer mon fichier sed à partir d'un autre fichier sed ?



il est toujours possible de faire sed "..." plutôt que sed '...'
auquel cas, tu peux mettre tes expressions rationnelles sous forme
de variables au niveau shell.



Voui, mais mes gros truc sed, j'ai tendance à les mettre dans un fichier.
Car après, il sinon, il faut se battre avec $ (fin de ligne sed) et
les .

alternative, awk ?
awk -v q="'" '


C'est quoi ce q="'" ' ?

BEGIN { rat="(?[+-]?[0-9/])?" }
$0 ~ rat { ...; next }



J'ai pensé à awk, mais je ne l'ai jamais utilisé comme ça. En plus, il
me faut gawk, pour avoir accès à gensub. Car je fait des substitutions contextuelles,
genre
s/Delta ([0-9]*)/delay(1)/g
Et comme gensub ne modifie
pas son argument, mon code devient un truc genre
{ x = $0
x = gensub( /Delta ([0-9]*)/ , "delay(\1)" , "g" )
x = gensub ...
...
}
Et il me faut reprendre mes expressions régulières, car les conventions \ ne sont
pas les même.

Et surtout, je n'arrive pas à mettre la variable dans l'expression régulière...
Soit le fichier test-sub.awk
BEGIN { RAT="[0-9]*" }
{ print "org:" $0
print "RAT=" RAT
print gensub( /Delta *(RAT)/ , "delay(\1)" , "g")
print gensub( /Delta *([0-9]*)/ , "delay(\1)" , "g")
}
Alors, ça me donne
% echo "Delta 4" | awk -f test-sub.awk
org:Delta 4
RAT=[0-9]*
Delta 4
delay(4)

J'en reviens à générer mon fichier sed avec sed...

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Cyrille Lefevre
Le #21690571
Le 05/05/2010 10:53, Marc Boyer a écrit :
Cyrille Lefevre
Le 04/05/2010 13:38, Marc Boyer a écrit :
Bonjour,

je suis en train de faire un script sed, et j'aurais besoin
de macros.






<snip>

tu aurais un exemple d'entrée et sortie attendue ?

sinon, qqs pointeurs :

http://awk.info
http://code.google.com/p/lawker/source/browse/#svn/fridge/gawk
=> text/multisub
http://sed.sourceforge.net/

alternative, awk ?
awk -v q="'" '


C'est quoi ce q="'" ' ?



une habitude, si j'ai besoin d'une ', j'utilise q plutôt que '"'"',
plus lisible, non ? :-)

BEGIN { rat="(?[+-]?[0-9/])?" }
$0 ~ rat { ...; next }



J'ai pensé à awk, mais je ne l'ai jamais utilisé com me ça. En plus, il
me faut gawk, pour avoir accès à gensub. Car je fait des subs titutions contextuelles,
genre
s/Delta ([0-9]*)/delay(1)/g
Et comme gensub ne modifie
pas son argument, mon code devient un truc genre
{ x = $0


pas nécessaire...
x = gensub( /Delta ([0-9]*)/ , "delay(\1)" , "g" )
x = gensub ...
...
}
Et il me faut reprendre mes expressions régulières, car le s conventions \ ne sont
pas les même.



alors en fait, c'est très simple...
si tu es entre /, c'est , si tu es entre ", c'est \, simple non ?
le pb étant que l'on ne peut utiliser les / que pour la recherche et
pas pour le remplacement... ce qui oblige effectivement à utiliser u ne
syntaxe différente selon le contexte !
ex.: sub(/./, "x") vs sub("\.", "x")
le plus simple est presque de tout mettre entre " avec 2

Et surtout, je n'arrive pas à mettre la variable dans l'express ion régulière...
Soit le fichier test-sub.awk
BEGIN { RAT="[0-9]*" }
{ print "org:" $0
print "RAT=" RAT
print gensub( /Delta *(RAT)/ , "delay(\1)" , "g")


pourquoi tu protèges les blancs ? " *" devrait suffire ?
print gensub( /Delta *([0-9]*)/ , "delay(\1)" , "g")
}



function sed(search, replace, string) {
return gensub(search, replace, "", string)
}
function gsed(search, replace, string) {
return gensub(search, replace, "g", string)
}
BEGIN { RAT="[0-9]*" }
{ delta = "Delta\ *(" RAT ")"; delay = "delay(\1)"
# ^^ pour l'exemple...
print gsed(delta, delay, "g", $0) }

alternative :
function sed(search, replace, string) {
if (string == "") string = $0
return gensub(search, replace, "", string)
}
...
print gsed(delta, delay, "g") }

J'en reviens à générer mon fichier sed avec sed...



c'est une idée aussi, mais tu dois aussi avoir le pb des vs => \

PS : au besoin, penses à -W re-interval sous gawk : x{1,}

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.
Marc Boyer
Le #21691851
Le 05-05-2010, Cyrille Lefevre
Le 05/05/2010 10:53, Marc Boyer a écrit :
Cyrille Lefevre
Le 04/05/2010 13:38, Marc Boyer a écrit :
Bonjour,

je suis en train de faire un script sed, et j'aurais besoin
de macros.






<snip>

tu aurais un exemple d'entrée et sortie attendue ?



Oula...

Gamma 3/5 + Gamma 5 -> affine(3/5) + affine(5)

En sed:
s/Gamma *([0-9/]*)/delay(1)/g

sinon, qqs pointeurs :

http://awk.info
http://code.google.com/p/lawker/source/browse/#svn/fridge/gawk
=> text/multisub
http://sed.sourceforge.net/



J'ai le "sed & awk" de O'Reilly.

alternative, awk ?
awk -v q="'" '


C'est quoi ce q="'" ' ?



une habitude, si j'ai besoin d'une ', j'utilise q plutôt que '"'"',
plus lisible, non ? :-)



Voui.

BEGIN { rat="(?[+-]?[0-9/])?" }
$0 ~ rat { ...; next }



J'ai pensé à awk, mais je ne l'ai jamais utilisé comme ça. En plus, il
me faut gawk, pour avoir accès à gensub. Car je fait des substitutions contextuelles,
genre
s/Delta ([0-9]*)/delay(1)/g
Et comme gensub ne modifie
pas son argument, mon code devient un truc genre
{ x = $0


pas nécessaire...



Oui, mais pour avoir une régularité du code, autant le faire
(sinon, le jour où on enlève le premier gensub...)

x = gensub( /Delta ([0-9]*)/ , "delay(\1)" , "g" )
x = gensub ...
...
}
Et il me faut reprendre mes expressions régulières, car les conventions \ ne sont
pas les même.



alors en fait, c'est très simple...
si tu es entre /, c'est , si tu es entre ", c'est \, simple non ?



OK. C'est ça qui me manquait comme info !

le pb étant que l'on ne peut utiliser les / que pour la recherche et
pas pour le remplacement... ce qui oblige effectivement à utiliser une
syntaxe différente selon le contexte !
ex.: sub(/./, "x") vs sub("\.", "x")
le plus simple est presque de tout mettre entre " avec 2



En effet.

Et surtout, je n'arrive pas à mettre la variable dans l'expression régulière...
Soit le fichier test-sub.awk
BEGIN { RAT="[0-9]*" }
{ print "org:" $0
print "RAT=" RAT
print gensub( /Delta *(RAT)/ , "delay(\1)" , "g")


pourquoi tu protèges les blancs ? " *" devrait suffire ?



Oui, en effet.

BEGIN { RAT="[0-9]*" }
{ delta = "Delta\ *(" RAT ")"; delay = "delay(\1)"



Oui, c'est l'usage des chaines ".." comme pattern que je
n'arrivait pas à faire fonctionner (à cause du \ surement).

J'en reviens à générer mon fichier sed avec sed...



c'est une idée aussi, mais tu dois aussi avoir le pb des vs => \



Heuh, non, pourquoi ?
J'écris 'à la shell'
s/Gamma *(${rat}) *(${rat})/delay(1,2)/g
dans le fichier .sed.pattern
et ensuite, un coup de
sed 's:${rat}:[0-9/]*:g'
pour générer le .sed

PS : au besoin, penses à -W re-interval sous gawk : x{1,}



Oui, intéressant aussi.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Publicité
Poster une réponse
Anonyme