[Shell] Detection de mots dans fichier
Résoluzipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
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
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.
-
Salut,
Tes balises à supprimer seront toujours sur 2 lignes ou elles sont aussi susceptibles de n'être que sur une seule ?
-
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 ...
-
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> $ -
-
-
-
-
-
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 ! :-)
-
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"> $ -
-
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> $ -
-
-