[Shell] variable + SED

Résolu/Fermé
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 - 1 juil. 2013 à 14:40
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 2 juil. 2013 à 10:16
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">



2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 1/07/2013 à 16:11
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
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
Modifié par yacleouf le 1/07/2013 à 16:53
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 juil. 2013 à 17:02
C'est la même chose que :

echo "${entete}" | sed '...'
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
1 juil. 2013 à 17:12
ok je vais creuser tous ça,
merci encore !
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
1 juil. 2013 à 15:34
hello
essayer
sed -i "1i\${entete}\n"  ${Folder}/referentiels/liste.xml
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
1 juil. 2013 à 15:57
Salut dubcek,

bel essai mais non ça ne marche pas, je retrouve en première ligne le nom de ma variable ${entete}
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
1 juil. 2013 à 16:00
avec guillemets, pas un double '
0
yacleouf Messages postés 438 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 8 juin 2015 39
1 juil. 2013 à 16:10
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 2/07/2013 à 08:53
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 juil. 2013 à 08:59
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