Supprimer un paragraphe contenant un mot

Résolu
Prezf Messages postés 8 Statut Membre -  
Prezf Messages postés 8 Statut Membre -
Bonjour à tous,
je suis nouveau sur le forum et je demande votre aide pour m'aider à mon problème.
J'ai actuellement un fichier .txt d'exemple de la forme :

-DEBUT-
BEGIN:VEVENT
DTSTAMP: ...
DTSTART: ...
DTEND: ...
UID: ...
SUMMARY:CM - InTsi\, InS4D\, InS4E
LOCATION: ...
DESCRIPTION: ...,
CATEGORIES: ...
END:VEVENT
-FIN-

j'ai cherché avec la commande sed comment supprimer tout un paragraphe du texte comme :
sed '/BEGIN/,/END/d' fichier.txt

et espérer avoir le résultat suivant :

-DEBUT-
-FIN-

Le seul problème c'est que je cherche a supprimer ce paragraphe mais a condition qu'il contienne le mot "InS4E"

J'espère que vous pourriez m'aider,
Merci d'avance

5 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
     
    Salut,

    sed '/DEBUT/{:z;N;/FIN/!bz;/InS4E/{s/\([^\n]*\n\).*\n\(.*\)/\1\2/};}'

    0
  2. Prezf Messages postés 8 Statut Membre
     
    Merci pour ta réponse mais il m'affiche une erreur :

    sed: 1: "/DEBUT/{:z;N;/FIN/!bz;/ ...": unexpected EOF (pending }'s)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
       
      Quel système ? Quelle version de sed ?

      Essaye en rajoutant un point virgule avant l'avant dernière accolade :

      sed '/DEBUT/{:z;N;/FIN/!bz;/InS4E/{s/\([^\n]*\n\).*\n\(.*\)/\1\2/;};}'


      Ou en mettant la syntaxe dans un fichier comme suit :
      $ cat script.sed 
      /DEBUT/ {                              
          :z                                 
          N                                  
          /FIN/ !b z                         
          /InS4E/ {                          
              s/\([^\n]*\n\).*\n\(.*\)/\1\2/ 
          }                                  
      }
      

      Et en l'appelant comma ça :
      sed -f script.sed fichier
      0
    2. Prezf Messages postés 8 Statut Membre
       
      En faisan l'appel avec le script.sed sa marche super ! Merci beaucoup !
      0
  3. Prezf Messages postés 8 Statut Membre
     
    J'ai peut-être parlé un peu vite, sa me supprime juste la dernière ligne

    Je suis sur MacBook et je n'arrive pas a connaitre la version de sed
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
       
      Chez moi (Gnu/Linux) :
      $ sed --version
      GNU sed version 4.2.1


      Voilà ce que ça donne :

      $ cat plop 
      -DEBUT0-
      BEGIN:VEVENT
      UID: ...
      SUMMARY:CM - InTsi\, InS4D\,
      LOCATION: ...
      END:VEVENT
      -FIN0-
      -DEBUT1-
      BEGIN:VEVENT
      UID: ...
      SUMMARY:CM - InTsi\, InS4D\, InS4E
      LOCATION: ...
      END:VEVENT
      -FIN1-
      -DEBUT2-
      BEGIN:VEVENT
      UID: ...
      SUMMARY:CM - InTsi\, InS4D\,
      LOCATION: ...
      END:VEVENT
      -FIN2-
      
      $ sed -f script.sed plop 
      -DEBUT0-
      BEGIN:VEVENT
      UID: ...
      SUMMARY:CM - InTsi\, InS4D\,
      LOCATION: ...
      END:VEVENT
      -FIN0-
      -DEBUT1-
      -FIN1-
      -DEBUT2-
      BEGIN:VEVENT
      UID: ...
      SUMMARY:CM - InTsi\, InS4D\,
      LOCATION: ...
      END:VEVENT
      -FIN2-
      
      $
      0
    2. Prezf Messages postés 8 Statut Membre
       
      J'ai testé cette option mais le problème est la :

      sed --version
      sed: illegal option -- -
      usage: sed script [-Ealn] [-i extension] [file ...]
      sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

      et effectivement c'est bien le resultat que je cherche !
      Je vais essayer de mettre a jour sed
      0
  4. Prezf Messages postés 8 Statut Membre
     
    C'est bon sa marche ! J'ai mis a jour sed et executé le script et sa marche super bien ! Encore un grand merci !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Prezf Messages postés 8 Statut Membre
     
    Et dit moi, tu aurai une idée de comment faire si je voulais faire la même chose mais a condition qu'il y ai deux mots présents dans l'intervalle ?
    Merci d'avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
       
      A la place de "/InS4E/" tu mets :

      /motif1.*motif2/

      En respectant l'ordre d'apparition des motifs 1 et 2.
      0
    2. Prezf Messages postés 8 Statut Membre
       
      Super merci !
      0