Supprimer un bloc avec sed

Résolu/Fermé
b.hamichi - 17 janv. 2009 à 17:25
 b.hamichi - 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.
A voir également:

11 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
17 janv. 2009 à 17:42
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
}
;-))
4
Trop fort !!!!!
Il est formidable ce forum :))))))))))))))))))
Je savais pas que SED est un outil tres puissant !!!!!
Je vous remercie :)
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
17 janv. 2009 à 18:38
De rien ;-))

Pour SED, voir la FAQ : http://www.commentcamarche.net/faq/478 sed
0
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
0

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

Posez votre question
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
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
19 janv. 2009 à 13:01
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 
0
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 :))
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
19 janv. 2009 à 16:05
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.
0
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
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
20 janv. 2009 à 11:23
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

0
Merci pour votre aide, c'est marche, très content :)))))))))))))))))
0