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.