Bonjour
dans un fichier xml je voudrais replacer la chaine
"<param-value>TOTO</param-value> " qui se trouve APRES
"<param-name>test.instance</param-name>"
s/arg1/arg2/mod; va remplacer arg1 par arg2 selon certaines règles et selon mod
(.+)? signifie : tout caractère répeté plus d'une fois, le tout repété un nombre inconnu de fois (en gros, n'importe quelle chaine avant l'expression suivante)
$1 correspond a ce qui se trouve entre la première parenthèse (ici ta chaine qui precède <param-name>test. ... )
$2 c'est la deuxième parenthèse
etc..
g signifie que tu va faire la recherche sur toutes les occurences de la chaine i signifie que tu es insensible a la casse
++
Le_T
Bonjour
Tu peux le faire via une expression standard (regexp):
(euh... tu es sur de vouloir remplacer par ca? puisque c'est la meme
chose!)
s/arg1/arg2/mod; va remplacer arg1 par arg2 selon certaines règles et
selon mod
(.+)? signifie : tout caractère répeté plus d'une fois, le tout
repété un nombre inconnu de fois (en gros, n'importe quelle chaine
avant l'expression suivante)
$1 correspond a ce qui se trouve entre la première parenthèse (ici ta
chaine qui precède <param-name>test. ... )
$2 c'est la deuxième parenthèse
etc..
g signifie que tu va faire la recherche sur toutes les occurences de la
chaine
i signifie que tu es insensible a la casse
s/arg1/arg2/mod; va remplacer arg1 par arg2 selon certaines règles et selon mod
(.+)? signifie : tout caractère répeté plus d'une fois, le tout repété un nombre inconnu de fois (en gros, n'importe quelle chaine avant l'expression suivante)
$1 correspond a ce qui se trouve entre la première parenthèse (ici ta chaine qui precède <param-name>test. ... )
$2 c'est la deuxième parenthèse
etc..
g signifie que tu va faire la recherche sur toutes les occurences de la chaine i signifie que tu es insensible a la casse
++
Le_T
J.Pierre Pourrez
Le Thu, 29 Sep 2005 03:38:36 -0700, Le_T a écrit :
Bonjour
Tu peux le faire via une expression standard (regexp):
(euh... tu es sur de vouloir remplacer par ca? puisque c'est la meme chose!)
A utiliser avec find si plusieurs fichiers à traiter sous linux.
on dissèque?
On lit le manuel: perldoc perlre
s/arg1/arg2/mod; va remplacer arg1 par arg2 selon certaines règles et selon mod
On peut avantageusement remplacer "/" par un autre caractère, surtout si on doit traiter du html, xml, ou autre langage à balises
Pour les nuls en anglais, c'est par là : http://perl.enstimac.fr/DocFr/perlre.html
Bon courage Jean-Pierre
Michel Rodriguez
laurent860 wrote:
dans un fichier xml je voudrais replacer la chaine "<param-value>TOTO</param-value> " qui se trouve APRES "<param-name>test.instance</param-name>"
Juste une remarque: pour traiter du XML, le plus correct c'est d'utiliser des outils XML.
Pour repondre d'avance aux remarques inevitables sur les perfos: dans ton cas ca sera probablement plus lent que d'utiliser des regexps, mais ca sera tres probablement plus correct (cf la celebre remarque, citee de memoire: "si le but est d'arriver a un resultat faux le plus vite possible, il fallait le preciser dans les specs"). En plus utiliser un parseur, ca permet de verifier que le XML traite est bien-forme, ce qui n'est pas toujours le cas.
Donc un exemple, avec of course XML::Twig:
#!/usr/bin/perl
use strict; use warnings;
use XML::Twig;
my $TOTO= "TOTO"; # pour montrer comment on quote proprement l'expression plus bas my $TATA= "TATA";
# sub appelee pour chaque init-param sub init_param { my( $twig, $init_param)= @_;
# c'est ici que tout se passe, il y a d'autres manieres de # trouver les elements a remplacer, par example avec une # mega requete XPath (en utilisant XML::Twig::XPath) que j'ai # la flemme de chercher if( ($init_param->field( 'param-name' ) eq 'test.instance') && (my $value= $init_param->first_child( qq{param-value[string()="$TOTO"]} ) ) ) { $value->set_text( $TATA); } $twig->flush; # ca imprime le document jusqu'a l'element init_param # et ca libere la memoire }
dans un fichier xml je voudrais replacer la chaine
"<param-value>TOTO</param-value> " qui se trouve APRES
"<param-name>test.instance</param-name>"
Juste une remarque: pour traiter du XML, le plus correct c'est
d'utiliser des outils XML.
Pour repondre d'avance aux remarques inevitables sur les perfos: dans
ton cas ca sera probablement plus lent que d'utiliser des regexps, mais
ca sera tres probablement plus correct (cf la celebre remarque, citee de
memoire: "si le but est d'arriver a un resultat faux le plus vite
possible, il fallait le preciser dans les specs"). En plus utiliser un
parseur, ca permet de verifier que le XML traite est bien-forme, ce qui
n'est pas toujours le cas.
Donc un exemple, avec of course XML::Twig:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $TOTO= "TOTO"; # pour montrer comment on quote proprement
l'expression plus bas
my $TATA= "TATA";
# sub appelee pour chaque init-param
sub init_param
{ my( $twig, $init_param)= @_;
# c'est ici que tout se passe, il y a d'autres manieres de
# trouver les elements a remplacer, par example avec une
# mega requete XPath (en utilisant XML::Twig::XPath) que j'ai
# la flemme de chercher
if( ($init_param->field( 'param-name' ) eq 'test.instance')
&& (my $value= $init_param->first_child(
qq{param-value[string()="$TOTO"]}
)
)
)
{ $value->set_text( $TATA); }
$twig->flush; # ca imprime le document jusqu'a l'element init_param
# et ca libere la memoire
}
dans un fichier xml je voudrais replacer la chaine "<param-value>TOTO</param-value> " qui se trouve APRES "<param-name>test.instance</param-name>"
Juste une remarque: pour traiter du XML, le plus correct c'est d'utiliser des outils XML.
Pour repondre d'avance aux remarques inevitables sur les perfos: dans ton cas ca sera probablement plus lent que d'utiliser des regexps, mais ca sera tres probablement plus correct (cf la celebre remarque, citee de memoire: "si le but est d'arriver a un resultat faux le plus vite possible, il fallait le preciser dans les specs"). En plus utiliser un parseur, ca permet de verifier que le XML traite est bien-forme, ce qui n'est pas toujours le cas.
Donc un exemple, avec of course XML::Twig:
#!/usr/bin/perl
use strict; use warnings;
use XML::Twig;
my $TOTO= "TOTO"; # pour montrer comment on quote proprement l'expression plus bas my $TATA= "TATA";
# sub appelee pour chaque init-param sub init_param { my( $twig, $init_param)= @_;
# c'est ici que tout se passe, il y a d'autres manieres de # trouver les elements a remplacer, par example avec une # mega requete XPath (en utilisant XML::Twig::XPath) que j'ai # la flemme de chercher if( ($init_param->field( 'param-name' ) eq 'test.instance') && (my $value= $init_param->first_child( qq{param-value[string()="$TOTO"]} ) ) ) { $value->set_text( $TATA); } $twig->flush; # ca imprime le document jusqu'a l'element init_param # et ca libere la memoire }