Я хочу найти в grep значение тега of и если оно 01, то вывести другой тег и его значение.
Пример XML файла :
<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<dept>developer</dept>
<account>01</account>
Желаемый результат :
Если значение счета равно 01, то он должен вывести следующее и общее количество случаев появления значения 01 в теге account:
<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<account>01</account>
count :1
Что я пробовал :
grep -oP '(? <=<<
01
grep -C 10 -oP '(?<=<
-C 10 выведет 10 строк выше и ниже, но это не сработало.
Не используйте grep или регулярные выражения вообще. Это очень плохой выбор для работы с XML , потому что XML является контекстным, а регулярные выражения - нет. Вы никогда не получите хрупкого раствора.
Однако существуют и другие варианты. Лично мне нравится perl
. Боюсь, я немного изменил ваш XML, потому что то, что вы опубликовали, недействительно. Вам НУЖЕН корневой тег, если ничего больше.
Однако что-то вроде этого будет делать то, что вы хотите:
#!/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>
Дайте нам более полный образец XML и желаемый результат, и мы сможем собрать что-то более точное для того, что вы пытаетесь сделать.
Но, пожалуйста, не используйте регулярные выражения, они просто не могут правильно обрабатывать XML. Это похоже на использование молотка, чтобы вкрутить шуруп в стену - это вроде работает, но ничего другого, кроме беспорядка, не будет ... а отвертки легко доступны.