Votre question

Script Shell : Supprimer un line feed [RESOLU]

Tags :
  • Script
  • Programmation
Dernière réponse : dans Programmation
20 Décembre 2006 20:40:35

Bonjour,
j'ai un tas de fichiers qui comporte une anomalie - Je voudrais donc les corriger par un outil.
Le problème de ces fichiers est que de temps en temps, Un line feed traine. Je voudrais donc supprimer ce line feed, mais pas tous !
Voici un exemple de fichier
!toto;titi;tata;\n ligne OK
!toto;titi;tata;teet;\n ligne KO
tutu;\n Ligne OK
Je voudrais donc remplacer "teet;\n" par "teet;" ( teet étant toujours là quand il y a une anomalie )
Comment faire ? ( avec sed ou awk par exemple )
( environnement UNIX AIX, ksh )
Merci d'avance de vos réponses

Autres pages sur : script shell supprimer line feed resolu

a b L Programmation
20 Décembre 2006 21:12:50

Si la commande sed est disponible:
  1. sed "s/teet;\n/teet;/g" fichier

21 Décembre 2006 09:06:48

Merci pour ces réponses rapides.
J'avais déjà essayé la commande sed, mais ça ne fonctionne pas ( pas de message d'erreur, mais ce ne modifie rien ) - J'ai essayé en modifiant le \n par \012, puis ^j , mais ca ne marche pas non plus.
J'ai visité d'autres sites, dont Developpez.net, il y a bien des tas de propositions, mais ce ne correspond jamais à un string+caractère de contrôle.
Si qq a des idées ...
Merci d'avance.
21 Décembre 2006 10:57:28

regle.sed:
  1. :join
  2. /teet;$/{N
  3. s/teet;\n/teet;/
  4. b join
  5. }


ensuite:
  1. sed -f regle.sed file_in > file_out


ca marche pas ca??
21 Décembre 2006 11:34:26

J'ai essayé, mais sans résultat :
"sed: There are too many '{'."
J'ai supprimé les { mais ca n'a rien changé dans mon fichier en sortie. Il me semble que "teet;\n" n'est pas reconnu comme ensemble par sed .
21 Décembre 2006 12:35:40

t'as du mal copier coller:
  1. sh-3.1$ more regle.sed
  2. :join
  3. /teet;$/{N
  4. s/teet;\n/teet;/
  5. b join
  6. }
  7. sh-3.1$ more file_in
  8. !toto;titi;tata;
  9. !toto;titi;tata;teet;
  10. tutu;
  11. sh-3.1$ sed -f regle.sed file_in
  12. !toto;titi;tata;
  13. !toto;titi;tata;teet;tutu;
  14. sh-3.1$


chez moi ca marche, ou alors c'est pas ce que tu veux
21 Décembre 2006 13:02:43

J'ai refait le fichier,et l'ai adapté pour ma config :
:join
/END_HIST;$/{N
s/END_HIST;\n/END_HIST;/
b join
}
Et il me répond :
cannot be parsed._HIST;$/{N
J'ai tenté plusieurs choses ( remplacement de _ par -,puis suppression de _, ... ) mais c'est pareil.
désolé, mais je dois louper qq chose , mais quoi ?
21 Décembre 2006 13:34:08

!!
la je vois pas trop, ce que tu peux faire, c'est poster comme ce que j'ai fait une partie de ton fichier (3 lignes), le fichier regle.sed que tu as créé et la sortie de la commande en entourant le tout avec la balise [ code ]
une question néammoins, c'est quel shell que tu utilises même si ca me parait bizarre?

EDIT: ce que je comprends pas c'est que la premiere fois t'as eu
Citation :

J'ai essayé, mais sans résultat :
"sed: There are too many '{'."


et après t'as un "cannot parsed" (avec le même fichier)??
21 Décembre 2006 14:15:17

Voilà les éléments :
Fichier ENDHIST.sed :
  1. :join
  2. /END_HIST;$/{N
  3. s/END_HIST;\n/END_HIST;/
  4. b join
  5. }

Fichier à traiter : demo.rtf
  1. begin
  2. END_HIT;BEG_HIST;05/05/2006 17:31:08;END_HIST;
  3. BEG_3.4;05/05/2006 17:31:08

le résultat :
  1. xxxxxxx/par > sed -f ENDHIST.sed demo.rtf
  2. cannot be parsed._HIST;$/{N
  3. xxxxxxx/par >

Mon objectif est de supprimer le Line Feed qui est après "END_HIST;" et seulement ceux-là.
je suis sur UNIX AIX et j'utilise le shell ksh
Merci encore
21 Décembre 2006 14:34:57

une derniere idée, c'est peut etre le format du fichier, tu l'ecris sous unix ou sous windows
dans le doute:
  1. dos2unix ENDHIST.sed
  2. dos2unix demo.rtf


c'est le seul cas ou j'ai une erreur
21 Décembre 2006 15:01:50

Eh bien BRAVO !!!!
C'était ça : j'ai créé le fichier sur WINDOWS avant de le transférer sur UNIX,sans passer par la conversion. ET CA MARCHE !!!

Merci beaucoup !
21 Décembre 2006 15:07:18

Mais comment je peux éditer le titre pour ajouter RESOLU ? je n'y arrives plus !
21 Décembre 2006 15:09:01

edite ton premier message.
21 Décembre 2006 20:04:35

Petite demande supplémentaire à coca25 : peux-tu m'expliquer la fonction de chacune des lignes sed ( sauf la ligne 3 que je connais ) ? Merci encore.
21 Décembre 2006 20:16:18

:join définit un label
/END_HIST;$/ permet de séléctionner que les lignes contenant ce pattern
le "N" permet de joindre 2 lignes pour les traiter en une fois
s/END_HIST;\n/END_HIST;/ sert à remplacer
b join permet de revenir au début

voilà :) 
a b L Programmation
22 Décembre 2006 19:41:39

En fait c'était pas "\n" mais "\r\n" ;) 
22 Décembre 2006 20:27:18

Non,c'était bien "\n" ( je suis sous unix , donc pas de CR LF mais seulement LF).
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS