Por favor, não use awk
sed
etc. Eles não podem manipular XML
corretamente. XML
faz um monte de coisas como ter espaço em branco, feeds de linha, tags unários, etc., o que significa que expressões regulares não são muito robustas - elas quebram, seguindo uma alteração perfeitamente válida para XML.
A maneira de manipular XML
é com um analisador. xmlstarlet
é um comumente usado no Linux. Porque eu ainda não vi isso sugerido, eu usaria Perl. Por exemplo:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parsefile ('your_xml_file.xml');
foreach my $HW ( $twig -> findnodes ( '//HARDWARE' ) ) {
print join ( "\t", map { $_ -> text } $HW -> children ),"\n";
}
- Analise o XML
- iterar os elementos
HARDWARE
. - Extraia o
text
das crianças - imprima isso.
Você pode estender um pouco para permitir que você lide com, por exemplo conjuntos de campos / pedidos diferentes:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my @fields_to_show = qw ( OS NAME );
my $twig = XML::Twig -> parsefile ( 'your_filename.xml' );
foreach my $HW ( $twig -> findnodes ( '//HARDWARE' ) ) {
my %fields = map { $_ -> tag => $_ -> text } $HW -> children;
print join ("\t", @fields{@fields_to_show}),"\n";
}
Ele gera um hash (array associativo) chamado %fields
que se parece com (para cada elemento):
$VAR1 = {
'OS' => 'Windows 7',
'NAME' => 'WIN1',
'DOMAIN' => 'contoso.com',
'IP' => '1.2.3.4'
};
Em seguida, usamos @fields_to_show
para especificar qual exibir e em qual ordem.
Então, isso imprimirá:
Windows 7 WIN1
Windows 8 WIN2
NB: Eu também tenho que 'consertar' seu XML, porque sem uma única tag root é inválido. Outras respostas mencionaram isso. O XML
spec é bastante rigoroso - quebrado XML
deve ser rejeitado. Então, é realmente uma má forma de "consertar" XML e, normalmente, eu sugiro que alguém o gere na cabeça com uma cópia da especificação XML.