Création
d'entreprise
Posez votre question Signaler

Simple mais penible avec SED [Résolu]

alexgtk - Dernière réponse le 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
Lire la suite 

Simple mais penible avec SED »

6 réponses
Réponse
+0
moins plus
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$

;-))
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
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$

;-))
Ajouter un commentaire
Réponse
+0
moins plus
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...
Ajouter un commentaire
Réponse
+0
moins plus
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$

;-))
Ajouter un commentaire
Réponse
+0
moins plus
Impeccable ! Effectivement je risquais pas de trouver ...
Ajouter un commentaire
Ce document intitulé « Simple mais penible avec SED » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?