Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 07/01/2010, 12h02   #1
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut [HP UX] Conversion de fichier texte en enlevant des linefeed

Bonjour,

Je suis donc sur HP UX version 11.23

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
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2010, 13h29   #2
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut trouvé

en fait il faut "escaper" le LF dans le fichier sed.

Pas moyen de faire cela en une seule commande SED.
Il faut rajouter un LF à la fin du fichier tmp pour que sed le prenne en compte.

Le OneLine.sed est donc :
Code :
1
2
3
4
s|\
||g
s|</Requete>|</Requete>\
|g
et dans mon code :
Code :
1
2
3
4
#!/bin/ksh
tr -d '\n' < file.dat > file.tmp
echo "" >> file.tmp
sed -f OneLine.sed file.tmp > file.out
Une autre façon plus propre (soufflé par un membre du club) :
Code :
awk '{printf("%s", $0); if ($0 == "</Requete>" ) print}' file.dat > file.out

Dernière modification par rafuoner ; 07/01/2010 à 14h19.
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 02h15.


 
 
 
 
Partenaires

Hébergement Web