Forum Programmation.shell Sed et résultat de commande sous bash

Posté par  .
Étiquettes : aucune
0
11
avr.
2007
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  (site web personnel) . Évalué à 1.

    Tu colles ta première ligne dans une variable

    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  . Évalué à 2.

    ça ressemble à quoi, résultat1 et résultat2 ? Parce que normalement (attention: double quotes et non pas single quotes):

    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  (site web personnel) . Évalué à 1.

      Voui, sauf que si tu es sous windows et que tu manipules de chemins complets, tu as des chances de rencontrer des / et/ou des \, voire des :, et que là ça te fout la grouille...
      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  . Évalué à 1.

        mon problème général en fait, c'est que la définition de variable ne marche pas sous la forme :
        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  . Évalué à 1.

          C'est bon j'ai trouvé mon problème vient des côtes merci à vous pour vos réponses.

          A + ;-)
      • [^] # Re: précisions

        Posté par  . Évalué à 2.

        Voui, sauf que si tu es sous windows et que tu manipules de chemins complets, tu as des chances de rencontrer des / et/ou des \, voire des :, et que là ça te fout la grouille...

        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.