Simple mais penible avec SED

Résolu
Bonjour a tous,

Je me casse un peu la tete sur sed, j'arrive a passer certaines commandes sous vim et je ne trouve pas leur equivalent sur sed (je voudrais eviter vi -c pour mon script).

Supposons que je veuille supprimer une ligne vide entre deux lignes particulieres, j'utilise la syntaxe vim suivante pour matcher un pattern contenant une ligne vide :
:%s/TOTO\n\n\(.*\)TOTO/TOTO\n\1TOTO/g

Cette commande aura pour effet de retirer une ligne vide qui est comprise entre deux lignes finissant par TOTO.

Neanmoins, sed ne permet pas de matcher les \n aussi simplement, et
sed -i 's/TOTO\n\n\(.*\)TOTO/TOTO\n\1TOTO/g' me fonctionne pas (pas non plus en remplacant \n par \r ou ^$)

Quelqu'un aurait-il une idee ?

merci bcp

6 réponses

  1. Modérateur
    Salut,

    jp@MDK:~/tmpfs ssh$ cat toto
    Ligne finissant par TOTO
    
    Une autre ligne finissant par TOTO
    
    jp@MDK:~/tmpfs ssh$ sed '/TOTO$/,/TOTO$/{/^$/d}' toto
    Ligne finissant par TOTO
    Une autre ligne finissant par TOTO
    
    jp@MDK:~/tmpfs ssh$

    ;-))
    0
    1. On se rapproche fortement de ce que je recherche !
      La difference reste qu avec la syntaxe precedente sous vim, les pattern qui correspondaient ne contenaient qu une seule ligne ET qui est vide, c est a dire :

      ...TOTO

      ...TOTO

      c est bon, mais

      ..TOTO
      blabla
      ...TOTO

      c est pas bon (idem si plusieurs lignes vides)
      0
      1. Modérateur
        Fallait commencer directement par là ;-))

        jp@MDK:~/tmpfs ssh$ cat toto
        Ligne finissant par TOTO
        
        Une autre ligne finissant par TOTO
        Autre ligne finissant par TOTO
        blabla
        blablabla
        
        blabla
        blablabla
        Et une dernière en TOTO
        
        jp@MDK:~/tmpfs ssh$ sed '/TOTO$/,/TOTO$/{//!d}' toto
        Ligne finissant par TOTO
        Une autre ligne finissant par TOTO
        Autre ligne finissant par TOTO
        Et une dernière en TOTO
        
        jp@MDK:~/tmpfs ssh$

        ;-))
        0
        1. aaaagh toutes mes excuses je me suis mal exprime

          quand je disais 'c'est pas bon', je voulais dire que je souhaitais que le pattern ne match pas, idealement ce que je cherche est donc :

          jp@MDK:~/tmpfs ssh$ cat toto
          Ligne finissant par TOTO

          Une autre ligne finissant par TOTO
          Autre ligne finissant par TOTO
          blabla
          blablabla

          blabla
          blablabla
          Et une dernière en TOTO

          jp@MDK:~/tmpfs ssh$ sed 'commande magique' toto
          Ligne finissant par TOTO
          Une autre ligne finissant par TOTO
          Autre ligne finissant par TOTO
          blabla
          blablabla

          blabla
          blablabla
          Et une dernière en TOTO

          j'espere que c'est plus clair mais du coup c'est surement moins simple...
          0
          1. Modérateur
            En gros on ne supprime une ligne vide que si la ligne précédente et la suivante finissent par TOTO ?

            Un truc comme ça devrait aller :

            jp@MDK:~/tmpfs ssh$ cat toto
            Ligne finissant par TOTO
            
            Une autre ligne finissant par TOTO
            bliblibli
            Autre ligne finissant par TOTO
            blabla
            blablabla
            
            
            blabla
            blablabla
            Et une dernière en TOTO
            
            jp@MDK:~/tmpfs ssh$ sed '/TOTO$/{:z;N;s/\(.*TOTO\n\)\n\(.*TOTO\)$/\1\2/;Tz};' toto
            Ligne finissant par TOTO
            Une autre ligne finissant par TOTO
            bliblibli
            Autre ligne finissant par TOTO
            blabla
            blablabla
            
            
            blabla
            blablabla
            Et une dernière en TOTO
            
            jp@MDK:~/tmpfs ssh$

            ;-))
            0
            1. Impeccable ! Effectivement je risquais pas de trouver ...
              0