OVH Cloud OVH Cloud

récupérer variables dans un fichier commande sed

7 réponses
Avatar
jean-charles Gibier
Hello
Comment intégrer des variables (issues d'environnement ou d'une ligne de
commande) dans un fichier de commande sed ?
par exemple je filtre le fichier contenant la ligne
"TOTO TITI TATA"
Je voudrais signifier à sed de changer TITI par BUBU *sans avoir à changer
le fichier de commande utilisé*
(TITI et BUBU étant des variables )


Thx
JCG

7 réponses

Avatar
Laurent
Il faudrait peut-être préciser si TITI est remplacé par sa valeur dans "TOTO
TITI TATA" car autrement en lisant la ligne "TOTO TITI TATA" rien ne permet
de savoir si TITI doit être interprété comme une variable ou bien comme du
texte.

Donc si TITI = "coucou" est ce que la ligne "TOTO TITI TATA" est en fait
".... coucou ...." ???
Avatar
Gibier Jean-Charles
"Laurent" a écrit dans le message news:
422ef14f$0$19320$
Il faudrait peut-être préciser si TITI est remplacé par sa valeur dans
"TOTO

TITI TATA" car autrement en lisant la ligne "TOTO TITI TATA" rien ne
permet

de savoir si TITI doit être interprété comme une variable ou bien comme du
texte.

Donc si TITI = "coucou" est ce que la ligne "TOTO TITI TATA" est en fait
".... coucou ...." ???



J'ai mal au crâne d'un coup ;-)
TITI est remplacé par une valeur passée en paramètre (je ne sais pas si ça
répond à la question).
Pour faire un exemple plus pratique ...
J'ai ceci dans un fichier de commande sed "sed.cmd" :
------------8<------------------
s/ARTICLE/La/
s/OBJET/voiture/
s/COULEUR/rouge/
------------8<------------------

J'ai ceci dans mon texte "toto.txt"
------------8<------------------
ARTICLE OBJET est COULEUR
------------8<------------------

$cat toto.txt | sed -f'sed.cmd'

donne (sauf erreur) :

$La voiture est rouge.

Ce que je voudrais savoir c'est s'il est possible de passer mes mes chaînes
de substitution : "La","voiture","rouge" comme paramètres.

Du style (bien sûr ça ne marche pas mais c'est parlant ;-)

s/ARTICLE/$ARTICLE/
s/OBJET/$OBJET/
s/COULEUR/$COULEUR/

ou bien

s/ARTICLE/$ENV{ARTICLE}/
s/OBJET/$ENV{OBJET}/
s/COULEUR/$ENV{COULEUR}/

Bref une manière de ne pas avoir à mettre les chaîne en 'dur' dans le
fichier de commande ...

JCG

Avatar
Laurent
Ben j'aurais dit que c'est directement possible d'écrire avec la syntaxe de
ton exemple, comme c'est montré en bas de cette page :
http://docs.hp.com/en/B2355-90128/sed.1.html
Mais je suppose que tu as du essayer sans succès ??? à moins que tu ais
oublié des accolades pour lever une ambiguité possible : ${TITI}.
Avatar
Pascal Bourguignon
"Gibier Jean-Charles" writes:
Pour faire un exemple plus pratique ...
J'ai ceci dans un fichier de commande sed "sed.cmd" :
------------8<------------------
s/ARTICLE/La/
s/OBJET/voiture/
s/COULEUR/rouge/
------------8<------------------

J'ai ceci dans mon texte "toto.txt"
------------8<------------------
ARTICLE OBJET est COULEUR
------------8<------------------

$cat toto.txt | sed -f'sed.cmd'

donne (sauf erreur) :

$La voiture est rouge.

Ce que je voudrais savoir c'est s'il est possible de passer mes mes chaînes
de substitution : "La","voiture","rouge" comme paramètres.

Du style (bien sûr ça ne marche pas mais c'est parlant ;-)

s/ARTICLE/$ARTICLE/
s/OBJET/$OBJET/
s/COULEUR/$COULEUR/

ou bien

s/ARTICLE/$ENV{ARTICLE}/
s/OBJET/$ENV{OBJET}/
s/COULEUR/$ENV{COULEUR}/

Bref une manière de ne pas avoir à mettre les chaîne en 'dur' dans le
fichier de commande ...



Si tu peux te passer d'un fichier de commande sed, c'est super simple:

sed -e "s/ARTICLE/${ARTICLE}/" ...

Des substitutions peuvent être faites par le shell pour les données
immédiates, mais sed ne prend pas en entrée un fichier de commandes,
mais un fichier données, alors il faut passer par un fichier
temporaire:

ARTICLE=Le
OBJET=chat
COULEUR=noir

cat > /tmp/$$.sed <<"EOF"
s/ARTICLE/${ARTICLE}/
s/OBJET/${OBJET}/
s/COULEUR/${COULEUR}/
EOF
sed -f /tmp/$$.sed < in > out

Bien entendu, il faut faire attention quand on utilise $ dans une
regexp: il faudra mettre un anti-slash devant.


Finalement, je ne comprends pas pourquoi tu pose la question: tu sais
te servir de sed non?

---------cmd.sed----------
s/ARTICLE/${ARTICLE}/
s/OBJET/${OBJET}/
s/COULEUR/${COULEUR}/
--------------------------


sed -e "s/${ARTICLE}/${ARTICLE}/g"
-e "s/${OBJET}/${OBJET}/g"
-e "s/${COULEUR}/${COULEUR}/g"
< cmd.sed > /tmp/$$-cmd.sed

sed -f /tmp/$$-cmd.sed < toto.txt


Mais comme tu vois, s'il s'agit d'une simple série de substitution, ce
n'est pas la peine de passer par un fichier de commande. Seulement si
on s'amuse avec des boucles ou les espaces de motif ou de sauvegarde
un fichier de commande script devient utile.

--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.

Avatar
manu
jean-charles Gibier wrote:

"TOTO TITI TATA"
Je voudrais signifier à sed de changer TITI par BUBU *sans avoir à changer
le fichier de commande utilisé*
(TITI et BUBU étant des variables )


Suffit d'utiliser des double quotes:

p=TITI
t=BUBU
echo "TOTO TITI TATA" | sed "s/$p/$t/"

--
Emmanuel Dreyfus
Le cahier de l'admin BSD 2eme ed. est dans toutes les bonnes librairies
http://www.eyrolles.com/Informatique/Livre/9782212114638/livre-bsd.php


Avatar
jean-charles Gibier
"Laurent" a écrit dans le message news:
422f7faa$0$20253$
Ben j'aurais dit que c'est directement possible d'écrire avec la syntaxe
de

ton exemple, comme c'est montré en bas de cette page :
http://docs.hp.com/en/B2355-90128/sed.1.html
Mais je suppose que tu as du essayer sans succès ??? à moins que tu ais
oublié des accolades pour lever une ambiguité possible : ${TITI}.


Avec les expressions dans la ligne de commande oui j'ai essayé avec succès.
Mais j'aime bien pinailler ;-)

Avatar
jean-charles Gibier
"Pascal Bourguignon" a écrit dans le message news:

Des substitutions peuvent être faites par le shell pour les données
immédiates, mais sed ne prend pas en entrée un fichier de commandes,
mais un fichier données, alors il faut passer par un fichier
temporaire:

ARTICLE=Le
OBJET=chat
COULEUR=noir

cat > /tmp/$$.sed <<"EOF"
s/ARTICLE/${ARTICLE}/
s/OBJET/${OBJET}/
s/COULEUR/${COULEUR}/
EOF
sed -f /tmp/$$.sed < in > out


J'ai pensé à ça mais je ne veux pas faire d'usine à gaz.
En fait je pensais à une option mystérieuse qui m'aurait réglé ça par magie
;-)


Bien entendu, il faut faire attention quand on utilise $ dans une
regexp: il faudra mettre un anti-slash devant.


Finalement, je ne comprends pas pourquoi tu pose la question: tu sais
te servir de sed non?


Un peu oui mais je pense ne pas en avoir fait le tour.
C'est pour ça que je viens sur fr.c.o.u ;-)


---------cmd.sed----------
s/ARTICLE/${ARTICLE}/
s/OBJET/${OBJET}/
s/COULEUR/${COULEUR}/
--------------------------


sed -e "s/${ARTICLE}/${ARTICLE}/g"
-e "s/${OBJET}/${OBJET}/g"
-e "s/${COULEUR}/${COULEUR}/g"
< cmd.sed > /tmp/$$-cmd.sed

sed -f /tmp/$$-cmd.sed < toto.txt


Mais comme tu vois, s'il s'agit d'une simple série de substitution, ce
n'est pas la peine de passer par un fichier de commande. Seulement si
on s'amuse avec des boucles ou les espaces de motif ou de sauvegarde
un fichier de commande script devient utile.



Ben oui je pense que je vais en passer par là : un shell avec des
expressions contenant des variables dans la ligne de commande.
Merci.

JCG