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 :
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
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>
Evidemment la première chose qui m'est venu à l'esprit c'est 'sed'.
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>
J'ai donc créer un fichier de commande sed (OneLine.sed) qui contient ceci :
et dans un script ksh je fais un l'appel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 s| ||g s|</Requete>|</Requete> |g
Quand je l'exécute je reçois l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #!/bin/ksh sed -f OneLine.sed file.dat > file.out
Si j'essaie de remplacer le LF par \n :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sed: Function s| cannot be parsed.
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 s|\n||g s|</Requete>|</Requete>\n|g
J'ai essayé aussi avec "^J"... marche pas non plus. L'horreur quoi.
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
Mais pour avancer un peu j'ai essayé d'enlever les LF avec la commande tr puis de lancer un sed
J'ai bien un file.tmp qui ressemble à ceci :
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
sans aucun passage à la ligne.
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>
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
Partager