O que você fez de errado é tentar analisar XML com uma expressão regular. Esta é uma má ideia - às vezes funciona, mas torna o código frágil. O XML tem uma especificação que permite alimentações de linha, espaço em branco e aninhamento de tags - tudo o que o regex manipula muito mal.
A resposta real é 'use um analisador'.
Sugiro perl
e XML::Twig
como opções - existem outras:
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
'pretty_print' => 'indented',
'twig_handlers' => {
'File' => sub { $_->set_att( 'value', 'true' ) }
}
);
$twig->parsefile('config.xml');
$twig->print;
Eu fiz certas suposições sobre o conteúdo do seu XML - se você estiver preparado para dar um exemplo mais extenso, eu vou verificar e garantir que isso funcione como recuado.
Editar:
Com base no snippet que você postou, isso não é um XML válido, portanto, desconsidere o acima. Eu ainda sugiro que você não use algo que se pareça um pouco com XML, chamado output.xml
, porque esse é um caminho para todos os tipos de dor e aflição.
Meu código acima funcionará com:
<xml>
<File value="false"/>
<File value="false"/>
<File value="false"/>
<File value="false"/>
<File value="false"/>
<File value="false"/>
<File value="false"/>
</xml>
Você pode verificar a validade do XML aqui: link
Se deixarmos de lado o fato de que não é XML - isso funciona:
#!/usr/bin/perl
use strict;
use warnings;
while ( <DATA> ) {
#amend just line 7
if ( $. == 7 ) { s,<Filevalue=".*">,<Filevalue="true">,; }
print;
}
__DATA__
<Filevalue="false">
<Filevalue="false">
<Filevalue="false">
<Filevalue="false">
<Filevalue="false">
<Filevalue="false">
<Filevalue="false">
Qual você pode escolher por:
perl -nle 'if ( $.==7) {s,<Filevalue=".*">,<Filevalue="true">,g;} print;' notxml.txt