Ninguém disse isso ainda, então eu vou. POR FAVOR, não analise XML usando expressões regulares. XML é uma linguagem contextual e expressões regulares não são. Isso significa que você cria um código frágil, que um dia pode simplesmente quebrar.
Para mais exemplos, consulte: link
POR FAVOR, use um analisador. Eles existem em muitos idiomas - pessoalmente, eu gosto de perl
, e sua tarefa é um pouco assim:
#!/usr/bin/env perl
use strict;
use warnings;
#parser library
use XML::Twig;
#ingest data
my $twig = XML::Twig -> parse (\*DATA);
#iterate all tags <ThreadGroup>
foreach my $group ( $twig -> get_xpath('//ThreadGroup') ) {
#check testname regex match
if ( $group -> att('testname') =~ /AA/ ) {
#set enabled
$group -> set_att('enabled', 'true');
}
else {
#set disabled
$group -> set_att('enabled', 'false');
}
}
#pretty print options vary, see man page.
$twig -> set_pretty_print('indented_a');
$twig -> print;
__DATA__
<xml>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="OO CSS DPM PRI" enabled="true" />
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="AA CSS DPM PRI" enabled="true" />
</xml>
E sim - é necessário usar um analisador XML, porque as expressões regulares não podem fazê-lo com segurança. Há um monte de coisas em XML que são semanticamente idênticas, como ordenação de atributos, feeds de linha, tags unários, etc., que não são o mesmo regex. Mas um analisador não será pego por isso.
Os itens acima podem ser reduzidos a um liner se você preferir:
perl -MXML::Twig -e 'XML::Twig -> new ( twig_handlers => { ThreadGroup => sub { $_ -> set_att("enabled", $_ -> att("testname") =~ /AA/ ? "true" : "false" ) } } ) -> parsefile_inplace("yourfile")'
Sua equipe de sysadmin deve agradecê-lo por fazer isso (isso não quer dizer que eles o farão) porque qualquer solução baseada em expressões regulares pode quebrar um dia, sem motivo aparente.
Como um exemplo mais trivial - seu XML é semanticamente idêntico como:
<xml>
<ThreadGroup
enabled="true"
guiclass="ThreadGroupGui"
testclass="ThreadGroup"
testname="OO CSS DPM PRI"
/>
<ThreadGroup
enabled="true"
guiclass="ThreadGroupGui"
testclass="ThreadGroup"
testname="AA CSS DPM PRI"
/>
</xml>
Ou:
<xml>
<ThreadGroup enabled="true" guiclass="ThreadGroupGui" testclass="ThreadGroup"
testname="OO CSS DPM PRI"/>
<ThreadGroup enabled="true" guiclass="ThreadGroupGui" testclass="ThreadGroup"
testname="AA CSS DPM PRI"/>
</xml>
Ou:
<xml><ThreadGroup enabled="true" guiclass="ThreadGroupGui" testclass="ThreadGrou
p" testname="OO CSS DPM PRI"/><ThreadGroup enabled="true" guiclass="ThreadGroupG
ui" testclass="ThreadGroup" testname="AA CSS DPM PRI"/></xml>
Ou:
<xml
><ThreadGroup
enabled="true"
guiclass="ThreadGroupGui"
testclass="ThreadGroup"
testname="OO CSS DPM PRI"
/><ThreadGroup
enabled="true"
guiclass="ThreadGroupGui"
testclass="ThreadGroup"
testname="AA CSS DPM PRI"
/></xml>
E isso antes de entrarmos na classificação de atributos, no possível aninhamento de tags ou em outra substring que "corresponde" em lugares que você não espera.