Supprimer un bloc avec sed

Résolu
b.hamichi -  
 b.hamichi -
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.
Configuration: Linux Suse
Firefox 3.0

11 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. b.hamichi
     
    Trop fort !!!!!
    Il est formidable ce forum :))))))))))))))))))
    Je savais pas que SED est un outil tres puissant !!!!!
    Je vous remercie :)
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      De rien ;-))

      Pour SED, voir la FAQ : http://www.commentcamarche.net/faq/478 sed
      0
  3. b.hamichi
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. b.hamichi
     
    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
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  7. b.hamichi
     
    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
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  9. b.hamichi
     
    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
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  11. b.hamichi
     
    Merci pour votre aide, c'est marche, très content :)))))))))))))))))
    0