Existe um grande problema em tentar analisar XML com ferramentas unix 'padrão'. XML é uma estrutura de dados e suporta uma variedade de layouts que são semanticamente idênticos, mas não possuem a mesma linha e indentação.
Isso significa que é realmente uma má ideia analisar como base de linha / regex, porque você estará criando um código fundamentalmente frágil. Alguém pode reestruturar seu XML em algum momento, e seu código será quebrado sem nenhuma razão óbvia. Esse é o tipo de coisa que dá aos programadores de manutenção e futuros administradores uma dor real.
Então, sim, por favor use um analisador XML. Há uma variedade de opções - alguém te deu uma opção de python, então estou incluindo o perl aqui também.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
sub process_part {
my ( $twig, $part ) = @_;
if ( $part->att('name') =~ m/wheel/ ) {
$part->first_child('yrot')->set_att( 'min', 'INF' );
$part->first_child('yrot')->set_att( 'max', 'INF' );
}
}
my $twig = XML::Twig->new(
'pretty_print' => 'indented_a',
'twig_handlers' => { 'part' => \&process_part }
);
$twig->parsefile('your_file.xml');
$twig->print;
Agora, quanto à razão 'verificar', o seu texto é difícil - tudo isso é o mesmo:
<root>
<part
name="D_wheel1"
seqNumber="1">
<yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/>
</part>
<part
name="D_wheel2"
seqNumber="1">
<yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/>
</part>
<part
name="door"
seqNumber="1">
<yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/>
</part>
</root>
E:
<root><part name="D_wheel1" seqNumber="1"><yrot cur="0.000000" max="0.000000" min="0.000000"/></part><part name="D_wheel2" seqNumber="1"><yrot cur="0.000000" max="0.000000" min="0.000000"/></part><part name="door" seqNumber="1"><yrot cur="0.000000" max="0.000000" min="0.000000"/></part></root>
E:
<root
><part
name="D_wheel1"
seqNumber="1"
><yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/></part><part
name="D_wheel2"
seqNumber="1"
><yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/></part><part
name="door"
seqNumber="1"
><yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/></part></root>
Eles são todos semanticamente idênticos, mas espero que você possa ver - não irá analisar o mesmo. Coisas como tags unárias - como >
<yrot
cur="0.000000"
max="0.000000"
min="0.000000"
/>
Vs:
<yrot cur="0.000000" max="0.000000" min="0.000000" ></yrot>
Também - semanticamente idêntico. Então você pode sair com a linha e o regex, mas está apostando e construindo códigos frágeis.