Bonjour,
je souhaiterai intégrer dans mon sed un résultat d'une commande qui va remplacer une chaîne de caractère dans un fichier.
En fait je cherche à mettre à jour mon fichier server.ini de mon antivirus où je dois remplacer le numéro de version du pattern ainsi que sa taille :
pour la version j'ai la commande pour résultat1 :
ls -l | grep lpt | cut -d' ' -f15 | cut -d. -f1 | sed "s/lpt//g"
pour la taille j'ai la commande pour résultat2 :
ls -l | grep lpt | cut -d' ' -f11
Je veux intégrer le résultat de chaque commande dans un sed du type :
sed "s/résultat1/401/g"
sed "s/résultat2/19145102/g"
Je fais plusieurs essais non concluant. J'utilise cygwin car je suis sur une machine windows.
Toutes vos idées ou remarques sont bonnes à prendre.
Merci d'avance
# j'ai eu a faire ce genre de trucs...
Posté par Obi MO (site web personnel) . Évalué à 1.
res1=$( ma commande)
puis tu tuilises sed pour échapper les antislashs et autres caractères spéciaux:
match=$(echo $res1|sed -e 's/\\/\\\\/g' -e 's:[\/\.\*\[\]\^\$\]:\\&:g')
puis tu peux faire ton sed comme si de rien n'était:
sed "s@$match@$replace@g"
Ca a l'air tordu mais ça marche. J'espère juste que tous les caractères vont bien passer ...
# précisions
Posté par left . Évalué à 2.
i=`ls (...)`
i=`echo $i | sed -e "s/$i/x/g"
fonctionne très bien car le $i est expansé par le shell avant l'appel de sed.
Enfin ca fonctionne très bien en sh et en bash.
[^] # Re: précisions
Posté par Obi MO (site web personnel) . Évalué à 1.
Un truc bon à savoir pour jongler avec les paths sous cygwin, c'est la commande cygpath, qui permet de basculer d'une forme windows à ne forme unix et lycée de versailles.
Par exemple dans le code que j'ai donné en premier commentaire, $replace est de la forme:
replace=$(cygpath -w $3 |sed 's/\\/\\\\/g')
Sinon, remplacer les `foo`par des $(foo) est assez utile, c'est réentrant, et tu peux écrire:
i=$(une commande qui utilise le résusltat d'une $(autre commande))
Pas sûr que ça marche en sh, mais sous cygwin on a bash de toutes façon ;)
drexh>Donne nous un exemple de ce que te donne ton ls et du résultat que tu voudrais avoir, ça ira plus vite...
[^] # Re: précisions
Posté par drexh . Évalué à 1.
toto = $(commande)
me donne l'erreur : invalid commande name "toto"
pareil en collant tout :
toto=$(commande)
ne marche que :
set toto 33
sinon pour pour les résultats le 1 :
400
le 2 :
18504560
[^] # Re: précisions
Posté par drexh . Évalué à 1.
A + ;-)
[^] # Re: précisions
Posté par left . Évalué à 2.
Avec sed, tu n'est pas obligé d'utiliser le caractère '/'. Donc quand tu sais que tu vas manipuler des chemins, alors tu utilises autre chose.
Les trois commandes suivantes sont équivalentes:
sed -e 's/xxx/yyy/'
sed -e 's@xxx@yyy@'
sed -e 's|xxx|yyy|'
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.