Conversion de fichier texte en enlevant des linefeed
Bonjour,
Un problème qui n'a pas de solution ce n'est pas un problème...
J'ai un fichier (file.dat) texte qui est une suite de xml :
Code:
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:
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:
1 2 3 4 5
|
s|
||g
s|</Requete>|</Requete>
|g |
et dans un script ksh je fais un l'appel :
Code:
1 2
| #!/bin/ksh
sed -f OneLine.sed file.dat > file.out |
Quand je l'exécute je reçois l'erreur :
Code:
sed: Function s| cannot be parsed.
Si j'essaie de remplacer le LF par \n :
Code:
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:
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:
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:
<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