Bonjour,

Je suis donc sur HP UX version 11.23

J'ai un fichier (file.dat) texte qui est une suite de xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
<Requete>
<Valeur1>un</Valeur1>
<Valeur2></Valeur2>
<Valeur3>trois</Valeur3>
</Requete>
<Requete>
<Valeur1>un</Valeur1>
<Valeur2>deux</Valeur2>
<Valeur3>trois</Valeur3>
</Requete>
Je voudrais créer un script qui me modifie le fichier pour qu'il ressemble à ceci (file.out) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
<Requete><Valeur1>un</Valeur1><Valeur2></Valeur2><Valeur3>trois</Valeur3></Requete>
<Requete><Valeur1>un</Valeur1><Valeur2>deux</Valeur2><Valeur3>trois</Valeur3></Requete>
Evidemment la première chose qui m'est venu à l'esprit c'est 'sed'.

J'ai donc créer un fichier de commande sed (OneLine.sed) qui contient ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
s|
||g
s|</Requete>|</Requete>
|g
et dans un script ksh je fais un l'appel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
#!/bin/ksh
sed -f OneLine.sed file.dat > file.out
Quand je l'exécute je reçois l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sed: Function s| cannot be parsed.
Si j'essaie de remplacer le LF par \n :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
s|\n||g
s|</Requete>|</Requete>\n|g
pas d'erreur mais il ne traite pas "\n" comme étant un passage à la ligne. Il me rajoute simplement un 'n' comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<Requete>
<Valeur1>un</Valeur1>
<Valeur2></Valeur2>
<Valeur3>trois</Valeur3>
</Requete>n
<Requete>
<Valeur1>un</Valeur1>
<Valeur2>deux</Valeur2>
<Valeur3>trois</Valeur3>
</Requete>n
J'ai essayé aussi avec "^J"... marche pas non plus. L'horreur quoi.

Mais pour avancer un peu j'ai essayé d'enlever les LF avec la commande tr puis de lancer un sed
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
OneLine.sed => 
s|</Requete>|</Requete>\n|g
 
script =>
#!/bin/ksh
tr -d '\n' < file.orig > file.tmp
sed -f OneLine.sed file.tmp > file.out
J'ai bien un file.tmp qui ressemble à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<Requete><Valeur1>un</Valeur1><Valeur2></Valeur2><Valeur3>trois</Valeur3></Requete><Requete><Valeur1>un</Valeur1><Valeur2>deux</Valeur2><Valeur3>trois</Valeur3></Requete>
sans aucun passage à la ligne.

Mais sed ne lit même pas le fichier file.tmp, et je me retrouve avec un file.out vide.
En revanche si je rajoute manuellement un LF à la fin de file.tmp, il traite le fichier... Il semble qu'il faille donc au moins un LF pour que sed traite le fichier.

Bref, j'ai essayé pas mal de chose, mais je n'arrive pas au résultat escompté...

Une idée ?

Merci