[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

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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 501
       
      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 501
       
      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 501
       
      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 501
       
      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