[Shell] Detection de mots dans fichier

Résolu
yacleouf Messages postés 461 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'essaie de réaliser un script en shell (bin/sh) qui chercherais dans un fichier xml des balises précises, et supprimerais leur contenu.
Par exemple :

<titi cette ligne serait à supprimer 
timestamp="2013-07-23">
<toto>
          <bla> blablablalbla</bla>
          <blo> 1111111111</blo>
</toto>
</titi>


Dans cette exemple, je souhaiterais détecter l'ouverture de balise titi et supprimer son contenu en gros supprimer toute cette ligne :
<titi cette ligne serait à supprimer
timestamp="2013-07-23">

Une fois ça fait, je rechercherais la balise </titi> et la supprimerais également.

j'ai fait plusieurs essais mais infructueux, notamment avec la commande sed,

Merci d'avance pour vos éclaircissements !



--
Google is your friend!

3 réponses

Résumé de la discussion

Un script en shell (bin/sh) est recherché pour supprimer le contenu entre des balises XML, depuis l'ouverture jusqu'à la fermeture, même lorsque le texte s'étend sur plusieurs lignes. Plusieurs participants évoquent l'usage de sed avec des plages allant de l'ouverture à la fermeture et soulignent que les cas multi-lignes nécessitent des ajustements, parfois via l'écriture du résultat. Réponse pratique: utiliser sed avec des motifs d'ouverture et de fermeture et récupérer le résultat dans un fichier, tandis que des échanges mentionnent des problèmes lorsque les balises s'étendent sur plusieurs lignes. Par ailleurs, certains proposent des variantes ou des outils alternatifs pour traiter des XML avec balises réparties sur plusieurs lignes afin d'éviter décalages et erreurs.

Bobot (l'IA à votre service)
  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    Tes balises à supprimer seront toujours sur 2 lignes ou elles sont aussi susceptibles de n'être que sur une seule ?
    0
  2. yacleouf Messages postés 461 Statut Membre 39
     
    Bonjour zipe31,

    c'est bien là qu'est mon soucis, en fonction des différents xml, elles peuvent être sur une deux ou même 4 lignes ...
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Qu'à cela ne tienne ;-))

      $ cat plop 
      <titi cette ligne serait à supprimer 
      timestamp="2013-07-23">
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      </titi>
      
      <titi cette ligne serait à supprimer timestamp="2013-07-23">
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      </titi>
      
      $ sed '/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/titi>/d' plop 
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      
      $
      0
    2. yacleouf Messages postés 461 Statut Membre 39
       
      Je vais test ça de suite !
      est ce qu'à la fin de cette ligne :
      $ sed '/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/titi>/d' plop
      je peux faire une redirection de ce style ? :
      $ sed '/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/titi>/d' plop >> monXml.xml 
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Oui.

      Mais tu peux aussi faire avec l'option "w" (write) de sed :

      sed '/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/titi>/d;w fichier.xml' plop
      0
    4. yacleouf Messages postés 461 Statut Membre 39
       
      zipe c'est nikel ça marche comme il le faut, par contre, saurait tu comment faire pour ne pas voir le traitement à l'écran ? est ce que c'est à cause de l'option w ?
      0
    5. yacleouf Messages postés 461 Statut Membre 39
       
      Sachant qu'en plus je vais répéter cette opération sur plusieurs autres fichiers en entrées, mais je garde la même sortie
      0
  3. yacleouf Messages postés 461 Statut Membre 39
     
    Re tous le monde,
    Du coup j'ai testé un peu les "limites" de sed, et j'ai un cas ou mon sed :
    sed '/^<?xml .*?>$/d;/^<?xml /,/?>$/d;/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/taleo>/d' maSource.xml >>monXml.xml
    


    enfaite quand mon entête xml est de ce genre :
    <?xml version="1.0" encoding="UTF-8"?>
    <balise1 xmlns=""
           timestamp="2013-07-23T12:00:25.944+02:00">
    

    ça marche, en revanche si je modifie mon entete comme ça par exemple :
    <?xml version="1.0" encoding="UTF-8"?><balise1 xmlns="" timestamp="2013-07-23T12:00:25.944+02:00">
    

    (tout sur une ligne) mon sed ne fait rien ... j'ai essayé aussi de le mettre dans une variable mais rien aussi...

    Si quelqu'un à une réponse, ou une piste ! :-)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Bizarre chez moi ça marche :

      $ cat plop -n
           1	<?xml version="1.0" encoding="UTF-8"?>
           2	<balise1 xmlns=""
           3	       timestamp="2013-07-23T12:00:25.944+02:00">
           4	<toto>
           5	          <bla> blablablalbla</bla>
           6	          <blo> 1111111111</blo>
           7	</toto>
           8	
           9	<toto>
          10	          <bla> blablablalbla</bla>
          11	          <blo> 1111111111</blo>
          12	</toto>
          13	</balise1>
          14	
          15	<?xml version="1.0" encoding="UTF-8"?><balise1 xmlns="" timestamp="2013-07-23T12:00:25.944+02:00">
      
      $ sed -n '/^<?xml/,/timestamp=/p' plop
      <?xml version="1.0" encoding="UTF-8"?>
      <balise1 xmlns=""
             timestamp="2013-07-23T12:00:25.944+02:00">
      <?xml version="1.0" encoding="UTF-8"?><balise1 xmlns="" timestamp="2013-07-23T12:00:25.944+02:00">
      
      $ 
      0
    2. yacleouf Messages postés 461 Statut Membre 39
       
      oui j'ai essayé cette façon ça marche, sauf que mon soucis n'est pas le même que moim,
      moi je supprime les lignes d'entêtes :
      sed '/^<?xml .*?>$/d;/^<?xml /,/?>$/d;/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/taleo>/d' maSource.xml >>monXml.xml
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Oups j'ai cru que "moim" et "yacleouf" était une seule et même personne (sauf que moim n'était pas connecté, ça arrive souvent), toutes mes plates ;-((

      @moim : T'es gentil, la prochaine fois ouvre un autre sujet, merci.

      @yacleouf : Normal, la syntaxe n'est pas bonne:

      $ cat plop 
      <?xml version="1.0" encoding="UTF-8"?>
      <balise1 xmlns=""
             timestamp="2013-07-23T12:00:25.944+02:00">
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      </balise1>
      
      <?xml version="1.0" encoding="UTF-8"?><balise1 xmlns="" timestamp="2013-07-23T12:00:25.944+02:00">
      
      $ sed '/^<?xml .*[^?]>$/d;/^<?xml /,/">/d' plop 
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      
      <toto>
                <bla> blablablalbla</bla>
                <blo> 1111111111</blo>
      </toto>
      </balise1>
      
      
      $
      0
    4. yacleouf Messages postés 461 Statut Membre 39
       
      j'ai jamais posté sans être connecté :)
      Je vais test ton petit bout ! Merci encore :)
      0
    5. yacleouf Messages postés 461 Statut Membre 39
       
      Et voilà conclusion, ça marche aussi !
      en tout cas l'intervention de moim m'aura permis d'avoir un petit bout de code à garder sous le coude !

      Merci encore Zipe !
      0