Sem algum exemplo de XML, isso é difícil. Eu recomendo strongmente NÃO usar expressões regulares, porque as expressões regulares realmente não fazem XML muito bem.
Eu provavelmente abordaria isso assim:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $start_renumber = 125;
my $twig = XML::Twig -> new ( pretty_print => 'indented_a' ) -> parse ( \*DATA );
foreach my $test_elt ( $twig -> findnodes ( '//test[@data-seq]' ) ) {
$test_elt -> set_att('data-seq', $start_renumber++ );
}
$twig -> print;
__DATA__
<xml>
<test data-seq="999" />
<test some-other="fish" />
<test data-seq="123125" />
</xml>
Transforma a nossa saída em:
<xml>
<test data-seq="125" />
<test some-other="fish" />
<test data-seq="126" />
</xml>
E combine-o com File::Find
para fazer isso em todos os arquivos desejados.
Algo parecido com isto:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use File::Find;
my $start_renumber = 125;
sub update_data_seq {
my ( $twig, $element ) = @_;
if ( $element -> att('data-seq') > 125 ) {
$element->set_att( 'data-seq', $start_renumber++ );
}
}
sub process_xml {
next unless -f;
next unless m/\.xml/;
my $twig = XML::Twig->new(
pretty_print => 'indented_a',
twig_handlers => { '//span[@data-seq]' => \&update_data_seq }
);
$twig->parsefile_inplace($File::Find::name);
}
find( \&process_xml, "/path/to/search/for/xml",
"/some/other/path/if/you/want" );