LeBidule75 a écrit :
Merci BEAUCOUP pour votre aide.
Ca fonctionne sur plein de fichiers SAUF (et je viens de découvrir le cas) sur des fichiers xml où les balises se suivent... On parle par exemple de fichier xml de 200ko où toutes les balises sont stockées sur... une seule ligne... Avec ta formule sur ce type de fichier, il va traiter la première balise et s'arrêter. J'aurai besoin que le script poursuive la recherche.
Je précise que je ne suis pas auteur de ces fichiers
|
Voila pourquoi il faut préciser les choses dans son post initial.
Si tu peux avoir plusieurs tags <Attribute...> sur une même ligne, alors il suffit de faire:
perl -pe 's|(?<=\Q<Attribute name="CESTEST">\E)([^<]{0,18}+)([^<]*)(?=\Q</Attribute>\E)|$1|g' monfichier.xml
le g final c'est pour faire une substitution incrémentale sur la ligne, et remplacer . par [^<] (tout caractère sauf < ) évitera d'être trop greedy et de faire la troncature entre le premier tag ouvrant <Attribute name="CESTEST"> et le dernier tag fermant </Attribute> de la ligne lorsqu'il y a plus d'un tag Attribute par ligne.
Et en dernier, après tests, si tout est ok et qu'on ne veut plus de fichier de backup ajouter l'option -i
perl -i -pe 's|(?<=\Q<Attribute name="CESTEST">\E)([^<]{0,18}+)([^<]*)(?=\Q</Attribute>\E)|$1|g' monfichier.xml
Le seul cas de figure restant ou ça pourrait ne pas marcher, c'est si tu as des tags coupés en deux par un retour de ligne, auquel cas il vaut mieux lire tout le fichier d'un coup et non en mode ligne a ligne
Il y a un trick standard pour cela: le flag -0777
Et pour un match multiline, utiliser l'option de regexp smg et non plus seulement g.
perl -0777 -pe 's|(?<=\Q<Attribute name="CESTEST">\E)([^<]{0,18}+)([^<]*)(?=\Q</Attribute>\E)|$1|smg' monfichier.xml
Mais je doute que tu aies ceci dans ton fichier source, sinon, cela mérite en fait un traitement plus complexe, au cas ou un saut de ligne intervient dans un tag, etc.
A+,