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. 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
      1. Ben non ca marche pas, puisque le remplacement de \n par quoique ce soit ne donne rien !
        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. Ca marche !

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

            Merci !