como grep um valor de tag no arquivo xml e imprimir outros dois valores de tag no mesmo arquivo xml

0

Eu quero o valor de tag do grep e se o seu 01 ele deve imprimir outra tag e junto com seu valor.

Exemplo de arquivo XML:

<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<dept>developer</dept>
<account>01</account>

Saída desejada:

Se o valor da conta for 01, ele deverá imprimir o abaixo, juntamente com a contagem total de ocorrências do valor 01 na tag de conta:

<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<account>01</account>

contagem: 1

O que eu tentei:

grep -oP '(?<=<<c>account>).*(?=<<c>/account)' cust.xml

01

grep -C 10 -oP '(?<=<<c>account>).*(?=<<c>/account)' cust.xml

-C 10 imprimirá 10 linhas acima e abaixo, mas não funcionou.

    
por star 19.07.2016 / 16:18

1 resposta

0

Não use expressões grep ou regulares em geral. É uma péssima opção para trabalhar com XML , porque XML é contextual e expressões regulares não são. Você nunca obterá uma solução que não seja frágil.

No entanto, existem outras opções. Pessoalmente - eu gosto de perl . Eu modifiquei seu XML um pouco também, estou com medo, porque o que você postou não é válido. Você precisa de uma tag raiz, se nada mais.

No entanto, algo assim faz o que você quer:

#!/usr/bin/env perl
use strict;
use warnings 'all'; 

use XML::Twig;

#parse from 'data' block below. You probably want 'parsefile'. 
my $twig = XML::Twig -> parse ( \*DATA ); 
#set output formatting - one of the reasons why regex is prone to fail. 
$twig -> set_pretty_print ('indented_a');

#XPATH is _like_ regex, but for xml. 
#So in the below - we find 'acc' nodes, with an account with a string value of '01'. 
#And then print it.

foreach my $acc ( $twig -> get_xpath('//acc/account[string()="01"]/..' )) {
   $acc -> print;
}


#doing this a slightly different way - you could just increment the count
#in the above loop though
my $count = scalar $twig -> get_xpath('//account[string()="01"]');
print "\nNumber of matches: $count\n";

__DATA__
<root>
  <acc>
     <CustName>Unix</CustName>
     <CustomerId>999</CustomerId>
     <dept>developer</dept>
     <account>01</account>
  </acc>
  <acc>
     <CustName>Windows</CustName>
     <CustomerId>666</CustomerId>
     <dept>developer</dept>
     <account>02</account>
  </acc>
</root>

Dê-nos uma amostra XML mais completa e uma saída desejada, e podemos reunir algo mais preciso para o que você está tentando fazer.

Mas, por favor - não use expressões regulares, elas simplesmente não podem manipular XML adequadamente. É como usar um martelo para colocar um parafuso na parede - isso funciona, mas nunca será outra coisa senão bagunçado ... e as chaves de fenda estão prontamente disponíveis.

    
por 28.07.2016 / 11:48

Tags