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

Sed et variable

4 réponses
Avatar
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_mot=130

4 réponses

Avatar
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 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.
Avatar
Marc Boyer
Cyrille Lefevre <cyrille.lefevre-news% a écrit :
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
Avatar
Cyrille Lefevre
Le 05/05/2010 10:53, Marc Boyer a écrit :
Cyrille Lefevre<cyrille.lefevre-news% a à ©crit :
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.
Avatar
Marc Boyer
Le 05-05-2010, Cyrille Lefevre <cyrille.lefevre-news% a écrit :
Le 05/05/2010 10:53, Marc Boyer a écrit :
Cyrille Lefevre<cyrille.lefevre-news% a écrit :
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