[Shell] Detection de mots dans fichier

Résolu
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. Contributeur
    Salut,

    Tes balises à supprimer seront toujours sur 2 lignes ou elles sont aussi susceptibles de n'être que sur une seule ?
    1. 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 ...
      1. Contributeur
        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>
        
        $
      2. 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 
      3. Contributeur
        Oui.

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

        sed '/^<titi .*>$/d;/^<titi /,/>$/d;/^<\/titi>/d;w fichier.xml' plop
      4. 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 ?
      5. 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
    2. 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 ! :-)
      1. Contributeur
        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">
        
        $ 
      2. 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
      3. Contributeur
        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>
        
        
        $
      4. j'ai jamais posté sans être connecté :)
        Je vais test ton petit bout ! Merci encore :)
      5. 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 !

    Discussions similaires

    question pix mot caché

    7 réponses