Simple mais penible avec SED

Résolu/Fermé
alexgtk - 15 avril 2010 à 14:45
 alexgtk - 15 avril 2010 à 16:38
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
A voir également:

6 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 14:53
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 15:14
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
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

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

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 15:51
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
Impeccable ! Effectivement je risquais pas de trouver ...
0