Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/06/2022, à 11:31

PowaBanga

[Résolu] ]sed et variables...

Bonjour à tous,
voici une portion de text, contenu dans un fichier xml

text()
{
<command>
echo patate
echo Broncoli
<\command>
}

je souhaite donc, via un sed, remplace tous le contenu entre les balises command par un autre (sachant qu'il peut se trouver au milieu d'un fichier xml beaucoup plus gros)

text | sed ":a;N;$!ba;s/<command>.*<\/command>/<command>\nfind -name \*\.pkg\.tar\.\* -exec chmod 775 {} \\; ;\nfind -name \*\.pkg\.tar\.\* -exec mv -f {} qsdf/qsdfqf/qdfs/ \\; ;\ngit clean -df\n</command>/g"
sed: -e expression n°1, caractère 146: option inconnue pour « s »

il semble que cela ait un lien avec le caractère {}

mais si je backslash les accolades, ça ne marche pas non plus :

text | sed ":a;N;$!ba;s/<command>.*<\/command>/<command>\nfind -name \*\.pkg\.tar\.\* -exec chmod 775 \{\} \\; ;\nfind -name \*\.pkg\.tar\.\* -exec mv -f \{\} qsdf/qsdfqf/qdfs/ \\; ;\ngit clean -df\n</command>/g"
sed: -e expression n°1, caractère 150: option inconnue pour « s »

Dernière modification par PowaBanga (Le 12/06/2022, à 14:06)

Hors ligne

#2 Le 12/06/2022, à 11:38

kamaris

Re : [Résolu] ]sed et variables...

Tu as des / qui ne sont pas protégés.
Tu devrais prendre un autre caractère comme séparateur pour la commande s, par exemple % ou @.

Hors ligne

#3 Le 12/06/2022, à 13:50

PowaBanga

Re : [Résolu] ]sed et variables...

ha oui, j'avais pas pensé à ça. Merci !

Du coup j'ai ceci que je met dans une fonction pour tester, (il s'agit d'un morceau de texte qui en réalité est dans un xml plus gros):

text()                                                                                                                                                                                                    130 ↵  
{
echo "<command>qsdfqsdf
qsdfqsdf
gfgfg
</command>"
}

que je souhaite transformer par le contenu de cette commande (cette commande est déjà utilisé à d'autre fins) :

theCommands()                                                                                                                                                                                                    
{
echo "
find -name *.pkg.tar.* -exec chmod 775 {} \\; ;
find -name *.pkg.tar.* -exec mv -f {} qsdf/qsdfqf/qdfs/ \\; ;
git clean -df
"
}

je fais donc ceci

theCommandsInSed()                                                                                                                                                                                               
{
theCommands | sed ':a;N;$!ba;s/\\/\\\\/g;s/\*/\\*/g;s/\./\\./g;s/\n/\\n/g'  
}
# ce qui donne :
theCommandsInSed                                                                                                                                                                                                 
\nfind -name \*\.pkg\.tar\.\* -exec chmod 775 {} \\; ;\nfind -name \*\.pkg\.tar\.\* -exec mv -f {} qsdf/qsdfqf/qdfs/ \\; ;\ngit clean -df\n

Et là je galère parce que je n'arrive pas à mettre ma variable à l'intérieur de mon sed suivant

text | sed ':a;N;$!ba;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g'
text | sed ':a;N;$!ba;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g'

avec les double guillemets, ça transforme ma commande avant de la lancer :

powabanga@ArchiPavilion ~]$ text | sed ":a;N;$!ba;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                                    130 ↵  
powabanga@ArchiPavilion ~]$ text | sed ":a;N;$bash $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                      130 ↵  
sed: -e expression n°1, caractère 13: commande inconnue: « | »

# et je continue de tester au hasard on sait jamais :

powabanga@ArchiPavilion ~]$ text | sed ":a;N;$!ba;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                                    130 ↵  
powabanga@ArchiPavilion ~]$ text | sed ":a;N;$bash $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                      130 ↵  
sed: -e expression n°1, caractère 13: commande inconnue: « | »
powabanga@ArchiPavilion ~]$ text | sed ":a;N;$bash $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                        1 ↵  
powabanga@ArchiPavilion ~]$ text | sed ":a;N;\$\!ba $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                     130 ↵  
sed: -e expression n°1, caractère 17: commande inconnue: « | »
powabanga@ArchiPavilion ~]$ text | sed ":a;N;\$!ba $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                                        1 ↵  
powabanga@ArchiPavilion ~]$ text | sed ":a;N;\$bash $trollTrans  $trollTrans ;s%<command>.*</command>%<command>`theCommandsInSed`</command>%g"                                                                                          1 ↵  
sed: -e expression n°1, caractère 18: commande inconnue: « | »

le souci semble venir de ceci `$!ba` qui est pris en tant que variable à cause du `$` tout ce que je sais à propos de ce truc, c'est que ça fais partie de ce qui me permet d'utiliser sed avec les retours à la ligne


[édit]
j'ai fini par trouver, enfin !
Si je le fais en deux fois pour supprimer les retours de chariots dans la zone voulue au préalble, ça marche !

text | sed ':a;N;$!ba;s%<command>.*</command>%<command></command>%g' | sed "s%<command></command>%<command>`theCommandsInSed`</command>%g"

Dernière modification par PowaBanga (Le 12/06/2022, à 14:05)

Hors ligne

#4 Le 12/06/2022, à 15:16

pingouinux

Re : [Résolu] ]sed et variables...

Bonjour,
Pour ce que tu veux faire, python est bien adapté.

Le script :

$ cat le_script.py
#!/usr/bin/env python3
import sys, re

rec=re.compile(r'(?<=<command>).*?(?=</command>)',re.S)

with open(sys.argv[1]) as f: old=f.read()
with open(sys.argv[2]) as f: rep=f.read()
with open(sys.argv[3],'w') as g: g.write(rec.sub(rep,old))

Les nouvelles commandes :

$ cat rep
find -name *.pkg.tar.* -exec chmod 775 {} \\; ;
find -name *.pkg.tar.* -exec mv -f {} qsdf/qsdfqf/qdfs/ \\; ;
git clean -df

Utilisation :

./le_script.py vieux_fichier rep nouveau_fichier

Hors ligne

#5 Le 12/06/2022, à 19:15

kamaris

Re : [Résolu] ]sed et variables...

Oui ça peut valoir le coup de passer à autre chose que sed dans ces cas-là.
Sinon tu pouvais garder une seule commande sed, mais il fallait utiliser des guillemets simples sur une partie de la commande pour ne pas déclencher l'historique de commandes bash (avec le point d'exclamation).
Donc quelque chose comme ça devrait marcher :

text | sed ':a;N;$!ba;'"s%<command>.*</command>%<command>$(theCommandsInSed)</command>%g"

Hors ligne