|
Publicité | ||||||||||||||||||||||
|
|
#1 | ||||||||||||
|
Membre régulier
![]() Inscription : mars 2007 Messages : 88 ![]() |
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 :
Code :
J'ai donc créer un fichier de commande sed (OneLine.sed) qui contient ceci : Code :
Code :
Si j'essaie de remplacer le LF par \n : pas d'erreur mais il ne traite pas "\n" comme étant un passage à la ligne. Il me rajoute simplement un 'n' comme ceci : Code :
Mais pour avancer un peu j'ai essayé d'enlever les LF avec la commande tr puis de lancer un sed Code :
Code :
<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 |
||||||||||||
|
|
00
|
|
|
#2 | ||
|
Membre habitué
![]() Inscription : mai 2007 Messages : 138 ![]() |
Un petit awk:
Code :
Dernière modification par noooop ; 07/01/2010 à 14h02. |
||
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() Inscription : février 2008 Messages : 1 897 ![]() |
Code :
tr -d '\n' < file.dat | sed 's/<\/Requete>/&\n/g' > file.out |
|
|
00
|
|
|
#4 | ||
|
Nouveau Membre du Club
![]() David Inscription : avril 2009 Messages : 26 ![]() |
Salut rafuoner,
Avec while : Code :
|
||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 255 ![]() |
Code :
Dernière modification par JeitEmgie ; 07/01/2010 à 13h55. |
||
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
Alors utilisons awk:
Code :
awk 'BEGIN {ORS=""} {print; if ($0 == "</Requete>") print "\n"}' file_in > file_out
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
|
|
00
|
|
|
#7 | ||
|
Membre régulier
![]() Inscription : mars 2007 Messages : 88 ![]() |
@ noop, syjis & jmelyn :
J'avais pensé écrire un petit perl ou un awk pour résoudre le problème, mais il me parait tellement évident qu'un sed doit être employé que je ne veux meme pas l'envisager (je sais, je sais, je suis tétu comme une mule). @ N_BaH & JeitEmgie : ça fonctionne pas chez moi. Comme je dis, il semble que sed aie besoin au moins d'un LF pour lire l'input. Bref après le tr -d '\n' sed ne lit plus rien. Ce que j'ai 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 : et dans mon code : Code :
Merci de votre aide à tous ! PS : ma citation du début vient des Shadocks, j'avais oublié de préciser |
||
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 138 ![]() |
Toujours en awk:
Code :
awk '{printf("%s", $0); if ($0 == "</Requete>" ) print}' file.in > file.out |
|
|
00
|
|
|
#9 | |
|
Membre régulier
![]() Inscription : mars 2007 Messages : 88 ![]() |
Citation:
J'ai testé et approuvé ta solution. Tout en une ligne, plus facile |
|
|
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
@noooop:
Attention, petit problème dans ton programme awk: la commande print est équivalente à print $0, pas à print "\n". Le résultat est alors deux tags </Requete> en fin de chaque ligne. Il faudrait donc mettre explicitement print "\n". En tout cas pour Linux. Code :
awk '{printf("%s", $0); if ($0 == "</Requete>" ) print "\n"}' file.in > file.out
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
|
|
00
|
|
|
#11 | |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 138 ![]() |
oops...oui tu as raison. Merci
Citation:
|
|
|
|
00
|
|
|
#12 | |||
|
Membre régulier
![]() Inscription : mars 2007 Messages : 88 ![]() |
Citation:
Mais en mettant print "\n" on crée une ligne vide entre chaque xml. Bref ceci : Code :
|
|||
|
|
00
|
|
|
#13 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
Oops à mon tour,
Tu as raison rafuoner, j'ai dégainé trop vite.
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : mai 2007 Messages : 138 ![]() |
en fait c'est print ""
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com