[Shell] variable + SED

Résolu
yacleouf Messages postés 461 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour le forum,

je me permets de poster une question qui je pense vous paraitra simple .. (du moins je l'espère ;-) )
je vous détaille ce que je fait :

1/ je récupère les 4 premières lignes d'un fichiers xml que je stock en variable
entete=$(sed -n -e '1,4p' monFichierXML_*.xml)


2/ je souhaite enregistrer cette variable (cette ligne) en tant que première ligne dans un autre fichier :
sed -i '1i\' ${entete} \n ' ${Folder}/referentiels/liste.xml


Or le soucis c'est que la première ligne de mon fichier "monFichierXML_*.xml" n'est pas bien digérée dans le deuxième sed ... :

sed: can't read <?xml: No such file or directory
sed: can't read version="1.0": No such file or directory
sed: can't read encoding="UTF-8"?>: No such file or directory
sed: can't read <toor: No such file or directory
sed: can't read xmlns="https://www.amazon.fr/": No such file or directory
sed: can't read timestamp="2013-03-12T13:01:18.409+01:00">: No such file or directory
sed: can't read n: No such file or directory
sed: can't read  ${Folder}/referentiels/referentiels.xml


ci dessous le contenu de la variable entete :
<?xml version="1.0" encoding="UTF-8"?> <toor xmlns="https://www.amazon.fr/" timestamp="2013-03-12T13:01:18.409+01:00">




--
Google is your friend!

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    entete=$(sed -n -e '1,4p' monFichierXML_*.xml)
    new_entete=$(sed '$! s/$/\\/' <<<"${entete}")
    
    sed -i '1i\
    '"${new_entete}"' \n
    ' ${Folder}/referentiels/liste.xml

    Attention à l'imbrication des quotes simples/doubles dans la 2nd parties :-\

    Sinon, la syntaxe d'insertion dans sed doit impérativement mettre un anti-slash à chaque fin de ligne en cas d'ajout, sauf pour la dernière.

    En gros ta variable pour l'insertion doit ressembler à :
    <?xml version="1.0" encoding="UTF-8"?> \
    <toor xmlns="[http://www.a.fr]" \
    timestamp="2013-03-12T13:01:18.409+01:00"\
    >

    J'ai mis les retours à la ligne au pif...
    Zen my nuggets ;-)
    Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
    1
    1. yacleouf Messages postés 461 Statut Membre 39
       
      Bonjour Zipe31,
      Une fois encore tu viens à ma rescousse !
      new_entete=$(sed '$! s/$/\\/' <<<"${entete}")
      ceci était la solution attendue :-)
      Merci encore !
      si je peux abuser, tu pourrais m'expliquer ce passage
      <<<"${entete}
      Merci d'avance
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      C'est la même chose que :

      echo "${entete}" | sed '...'
      0
    3. yacleouf Messages postés 461 Statut Membre 39
       
      ok je vais creuser tous ça,
      merci encore !
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    essayer
    sed -i "1i\${entete}\n"  ${Folder}/referentiels/liste.xml
    0
    1. yacleouf Messages postés 461 Statut Membre 39
       
      Salut dubcek,

      bel essai mais non ça ne marche pas, je retrouve en première ligne le nom de ma variable ${entete}
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      avec guillemets, pas un double '
      0
    3. yacleouf Messages postés 461 Statut Membre 39
       
      je viens d'essayer avec double quotes "
      avc deux simple quote '' et avec une seule '
      sa ne passe pas soit j'ai l'erreur du début (à savoir sed: can't read ....)
      soit j'obtiens le nom de ma variables
      :/
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      pourtant je conserve bien les "
      $ entete='<?xml version="1.0" encoding="UTF-8"?> <toor xmlns="http://www.a.fr" timestamp="2013-03-12T13:01:18.409+01:00">'
      $ date > a
      $ sed -i "1i${entete}" a
      $ cat a
      <?xml version="1.0" encoding="UTF-8"?> <toor xmlns="[http://www.a.fr]" timestamp="2013-03-12T13:01:18.409+01:00">
      Tue Jul  2 08:49:51 CEST 2013
      $ 
      
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Là ça marche parce que ta variable est sur une seule ligne.
      Fais la même chose avec plusieurs lignes et ça échouera ;-(
      0