Sed retours chariots

Résolu
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 !

:-(
Configuration: Windows XP
Firefox 2.0.0.10

6 réponses

  1. Modérateur
    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. Ca marche !

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

      Merci !
      1. Modérateur
        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]$
        ;-))
        1. Ben non ca marche pas, puisque le remplacement de \n par quoique ce soit ne donne rien !
          1. 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