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?a...amp;id_mot0
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?a...amp;id_mot0

Poser une question


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.
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 .
C'est quoi ce q="'" ' ?
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?a...amp;id_mot0
<snip>
tu aurais un exemple d'entrée et sortie attendue ?
sinon, qqs pointeurs :
http://awk.info
http://code.google.com/p/lawker/sou...ridge/gawk
=> text/multisub
http://sed.sourceforge.net/
une habitude, si j'ai besoin d'une ', j'utilise q plutôt que '"'"',
plus lisible, non ? :-)
pas nécessaire...
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
pourquoi tu protèges les blancs ? " *" devrait suffire ?
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") }
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.
Oula...
Gamma 3/5 + Gamma 5 -> affine(3/5) + affine(5)
En sed:
s/Gamma *([0-9/]*)/delay(1)/g
J'ai le "sed & awk" de O'Reilly.
Voui.
Oui, mais pour avoir une régularité du code, autant le faire
(sinon, le jour où on enlève le premier gensub...)
OK. C'est ça qui me manquait comme info !
En effet.
Oui, en effet.
Oui, c'est l'usage des chaines ".." comme pattern que je
n'arrivait pas à faire fonctionner (à cause du \ surement).
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
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?a...amp;id_mot0