Sed retours chariots

Résolu
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   -  
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je sais que le sujet a déja été abordé en forum, mais je n'y ai pas trouvé ma réponse.

J'ai un fichier dont certaines lignes ont été tronquées.
Chaque ligne non tronquée est identifiée comme se finissant par le signe ">"

Pour réconcilier les lignes, j'applique donc

sed 's/[^>]\n//g' monfichier

Mais là je m'aperçois que le retour chariot n'est pas vu.
Un simple
sed 's/\n//g' monfichier
ne fonctionne pas non plus.

Ou plutôt, il est interprété dans un seul sens :

En effet, si je fais
sed 's/t/\n/g' monfichier
sed remplace bien tous les "t" par un retour chariot.
Par contre
sed 's/\n/t/g' monfichier
sed ne remplace rien !

:-(

6 réponses

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
sed '
:loop           # On définit une étiquette
/>$/! {        # Si la ligne ne se termine pas par >
N               # On ajoute la ligne suivante dans l'espace de travail
                 #+ Les lignes étant alors séparées par le caractère fin de ligne 
                 #++ représenté par "\n" 
s/\n//          # On supprime alors ce caratère
t loop         # On teste si un remplacement a eu lieu. Si c'est le cas on 
                 #+ se branche à l'étiquette
}
' tlep
;-))
1
Manu
 
Bonjour,

sed fonctionne par lignes et traite une ligne à la fois, sauf si on lui demande de concaténer la ligne suivante (commande n). Vous avez besoin de quelque chose du genre :

sed '/[^>]$/n;s/\n//'

Nota : non testé

Manu
0
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   118
 
Ben non ca marche pas, puisque le remplacement de \n par quoique ce soit ne donne rien !
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

En fait c'est pas la commande "n" ( pour "next" qui elle n'ajoute pas la ligne suivante à la ligne présente, mais la remplace) qu'il faut utiliser, mais la commande "N" conjointement avec une boucle de test.
Essaie ça :
[tmpfs]$ cat tlep
ligne1>
ligne2
ligne3
ligne4>
ligne5>
ligne6
ligne7>
ligne8
ligne9
ligne10>
[tmpfs]$ sed ':loop; />$/! N;s/\n//; t loop' tlep
ligne1>
ligne2ligne3ligne4>
ligne5>
ligne6ligne7>
ligne8ligne9ligne10>
[tmpfs]$
;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   118
 
Ca marche !

Tu peux expliquer cette drôle de syntaxe jipicy le magicien du shell ?

Merci !
0
tlep Messages postés 596 Date d'inscription   Statut Membre Dernière intervention   118
 
chapeau bas :-))
0