Posez votre question Signaler

Supprimer un bloc avec sed [Résolu]

b.hamichi - Dernière réponse le 21 janv. 2009 à 22:00
Bonjour,
J'explique mon probleme:
Voici un fichier.txt qui contient des Blocs de text repérés par des mots reservés BEGIN et END
BEGIN
sdsdsds
motif "text1"
szdsdes
...
END
BEGIN
sdsdsds
motif "text3"
szdsdes
...
END
BEGIN
sdsdsds
motif "text2"
szdsdes
...
END
J'aimerai supprimer le bloc entre BEGIN et END quand la chaine motif = text3
Merci pour votre aide.
Lire la suite 

Supprimer un bloc avec sed »

12 réponses
Réponse
+3
moins plus
Salut,
sed '/BEGIN/{:z;N;/END/!bz;/text3/d}' fichier
Explications :
/BEGIN/ {       # On trouve une ligne contenant le motif
    :z          # Etiquette
    N           # On ajoute la ligne suivante dans l'espace de travail
    /END/ !b z  # Si on aucun motif END n'est trouvé, on se branche
                #+ à l'étiquette z et on recommence
    /text3/ d   # Une fois le motif END trouvé, si on trouve un motif
                #+ correspondant à text3, on supprime le contenu de
                #++ de l'espace de travail
}
;-))
Ajouter un commentaire
Réponse
+0
moins plus
Trop fort !!!!!
Il est formidable ce forum :))))))))))))))))))
Je savais pas que SED est un outil tres puissant !!!!!
Je vous remercie :)
jipicy- 17 janv. 2009 à 18:38
De rien ;-))

Pour SED, voir la FAQ : http://www.commentcamarche.net/faq/478 sed
Ajouter un commentaire
Réponse
+0
moins plus
Je trouve que le cour est bien structuré, auriez vous un lien sur les "Expressions régulières", je crois que c'est vraiment la base de SED. Merci
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour jipicy,
Help me SVP :)

J'ai essayé la commande ci dessous sur un system interne à mon entreprise (TOP avec SH) ca ne marche pas !!!

sed '/SETpath/{:z;N;/IMPLpath/!bz;/LTS0545212-002/d}' monfichier

Erreur généré:

sed: The label /SETpath/{:z;N;/IMPLpath/!bz;/LTS047680-002/d} is greater than eight characters.

Sachant que cette manip fonctionne correctement sous OpenSUSE (SH)
Merci
Ajouter un commentaire
Réponse
+0
moins plus
Essaie d'exécuter ta commande comme ça (et non pas sur une seule ligne) :
sed '
/SETpath/ {
:z
N
/IMPLpath/ !b z
/LTS0545212-002/ d
}' tonfichier 
Ajouter un commentaire
Réponse
+0
moins plus
C'est cool, ça fonctionne !!!! peut tu m'expliquer la différence?

Maintenant je galaire sur un autre probleme, enfaite:

Je prends la LTS0545212-002 est je la remplace par '${M_tab[k]}' avec une boucle while pour incrémenter le K , ca fonctionne mais (tj mais :))), il mon script fais des modification sur le dernier élément du tableau

sed '
/SETpath/ {
:z
N
/IMPLpath/ !b z
/'${M_tab[k]}'/ d
}' $med_file > fileX

A mon avis, il faut aussi incrémenter le fichier $med_file

sed '
/SETpath/ {
:z
N
/IMPLpath/ !b z
/'${M_tab[k]}'/ d
}' $med_file_$k > fileX_$(($k+1))

Ça ne fonctionne toujours pas !
Auriez vous une autre solution
Merci encore pour vote patience :))
Ajouter un commentaire
Réponse
+0
moins plus
La différence tient essentiellement sur la version de "sed". On aurait pu aussi utiliser le paramètre "-e", mais là aussi c'est un peu biscornu à mettre en place...

Toujours est-il en parlant de version de "sed", qu'elle est celle que tu utilises (sed --version) ? Sur quel système ?
Si ta version est supérieure à 4.0.5, tu as le paramètre "-i" (in place) qui permet de modifier le fichier fourni en entrée sans passer par un fichier temporaire.
Ajouter un commentaire
Réponse
+0
moins plus
La version est inférieur à 4.0.5, et le paramètre "-i" (in place) n'existe pas

en tappant:
man sed --> j 'ai comme options (-e -n -f)

Y'a t'il une autre solution sans passer par des fichiers temporaires?
Peut on installer sur le système une nouvelle version de SED (et encore voir si j'ai tous les droits)

Merci
Ajouter un commentaire
Réponse
+0
moins plus
Re-

Y'a t'il une autre solution sans passer par des fichiers temporaires?
Malheureusement non, tu vas donc être obligé de passer par des fichiers temporaires à chaque itération de ta boucle :
sed '
/SETpath/ {
:z
N
/IMPLpath/ !b z
/'${M_tab[k]}'/ d
}' $med_file > fileX

mv -i fileX $med_file

Ajouter un commentaire
Réponse
+0
moins plus
Merci pour votre aide, c'est marche, très content :)))))))))))))))))
Ajouter un commentaire
Ce document intitulé « Supprimer un bloc 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 ?