Remplacer variable dans un fichier

JEROMAX Messages postés 275 Statut Membre -  
 Utilisateur anonyme -
Bonjour,

J'ai un petit problème. j'effectue un traitement que je récupère dans une variable, cette variable contient du texte et des caractères spéciaux comme des retours chariot. Je souhaite faire une substitution dans un fichier mais ça ne fonctionne pas.
La commande que j'utilise est
sed -i -e "s|##ROUTE##|${ROUTE}|" ${FICHIER}

La variable ${ROUTE} contient le résultat de
netstat -rn 
(avec des retours chariot donc,
echo ${ROUTE}
affiche bien ce qu'il faut).
La commande sed retourne
commande 's' inachevée

Je tente d'utiliser sed mais n'importe quelle commande peut faire l'affaire du moment que cela fonctionne... :-)
Je me dit que c'est forcément possible mais je sèche...

Merci beaucoup à ceux qui se pencheront sur le problème.



--

[ JEROMAX ]

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    avec awk (mais on ne peut pas modifier directement le fichier)
    awk -v v="${ROUTE}" '{sub("##ROUTE##", v); print}' ${FICHIER}
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      avec awk (mais on ne peut pas modifier directement le fichier)
      Si si, les dernières versions de awk ont implémenté cette possibilité ;-))
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    C'est clair que les retours à la ligne mettent le bronx ;-(

    Mieux vaut passer directement la commande à sed grâce au flag
    e
    :

    $ cat brol
    blablabla
    ##ROUTE##
    blablabla

    $ sed -i.bak 's|##ROUTE##|netstat -rn|e' brol

    $ cat brol
    blablabla
    Table de routage IP du noyau
    Destination Passerelle Genmask Indic MSS Fenêtre irtt Iface
    0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
    169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
    192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
    192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    blablabla

    $

    ;-))
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      les retours à la ligne mettent le bronx ;
      ou Marseille ...
      pourquoi ça, ça passe pas ?
      sed -i 's|##ROUTE##|echo '"${ROUTE}"'|e' brol 
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      ou Marseille ..
      ;-)) C'est clair que c'est plus d'actualité...

      pourquoi ça, ça passe pas ?
      Non ;-((

      $ sed 's|##ROUTE##|echo '"${var}"'|e' brol 
      sed: -e expression n°1, caractère 45: commande 's' inachevée
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      J'ai mal exprimé
      pourquoi est ce qu'avec echo ça ne passe pas alors qu'avec netstat, oui
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Je n'en ai pas la moindre idée ;-(
      Je suppute une histoire d'interprétation des fins de lignes...
      0
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      je dirais parce que $ROUTE est résoudu par le shell, donc les \n se trouvent sur la ligne de commande du sed. Ceci fonctionne, on récupère l'environement sans passer par le shell
      sed -i "s|##ROUTE##|awk 'BEGIN {print ENVIRON[\"ROUTE\"]}'|e" brol 
      0
  3. JEROMAX Messages postés 275 Statut Membre 10
     
    Salut tout le monde
    Merci à tous de vous être penchés sur le problème :
    - je ne peux pas utiliser la commande netstat directement car je vous ai donné une version très simplifiée de ce qui est réellement généré. En réalité, j'ai tout un tas de commandes derrière la variable ROUTE.
    - Je n'ai malheureusement pas la dernière version de awk installée sur les machines donc je ne peux utiliser le "inplace"
    - dubcek, ta commande
    sed -i "s|##ROUTE##|awk 'BEGIN {print ENVIRON[\"ROUTE\"]}'|e" brol
    m'intéressait beaucoup mais je n'arrive pas à la faire fonctionner, il ne récupère pas le contenu de ${ROUTE}

    En mixant un peu toutes vos idées, j'ai réussi à faire fonctionner le bouzin :
     echo "$(awk -v v="${ROUTE}" '{sub("##ROUTE##", v); print}' ${FICHIER})" > ${FICHIER} 

    bon je pense qu'il y a certainement (beaucoup) mieux mais c'est la seule commande qui marche...
    En tout cas, merci beaucoup !


    [ JEROMAX ]
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      il faut exporter ROUTE
      export ROUTE=$(netstat ...)
      $
      $ X="hello"; awk 'BEGIN {print ENVIRON["X"]}'

      $ export X="hello"; awk 'BEGIN {print ENVIRON["X"]}'
      hello
      $
      0
    2. Utilisateur anonyme
       
      salut,

      ou alors, uniquement pour awk (sans point-virgule):
      X="hello" awk 'BEGIN {print ENVIRON["X"]}'
      hello
      0