Simple mais penible avec SED

Résolu
alexgtk -  
 alexgtk -
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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. alexgtk
     
    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
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  4. alexgtk
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  7. alexgtk
     
    Impeccable ! Effectivement je risquais pas de trouver ...
    0