Многострочный grep с определенным текстом - PullRequest
0 голосов
/ 08 октября 2019

Существует xml-файл с большим количеством <A_tag> -s.

Мне нужно увидеть те теги A (и их дочерние элементы, то есть весь контент тегов), в которых есть хотя бы один <C_tag>.

Таким образом, этот блок должен соответствовать (следовательно, содержится в результате):

<A_tag>
    ...
    ...
    <C_tag attr1="" ... attrn="" />
    ...
</A_tag>

Я пытался использовать pcregrep, но я не знаю, как определить окончание любого блока, чтодлиннее 1 символа (а </A_tag> длиннее этого, но, например, [^>] regexp тоже было бы легко для меня).

Я тоже пробовал awk, но не смог с ним справитьсялибо.

Если кто-то из опытных поможет мне, пожалуйста, сделайте так, чтобы ваша команда разделяла найденные блоки и пустой строкой, чтобы я мог узнать больше.

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

После комментария xmllint:

xmllint --xpath '(//A_tag/C_tag/..)' x.xml

Будет искать C_TAG в A_TAG, а затем отображать родительский A_TAG.

Вывод:

<A_tag>
    <C_tag attr1="" attrn=""/>
</A_tag>
0 голосов
/ 10 октября 2019

Если файл хорошо напечатан (или следует схожим правилам), можно написать небольшой сценарий awk, и он действует только на строки a_tag и c_tag:

awk '
/<A_tag>/      { in_a=$0 ; c="" ; next }
in_a           { in_a = in_a RS $0}
/<C_tag/       { c=$0 ; next }
/<\/A_tag>/    { if ( in_a && c ) { print in_a ; in_a="" ; c=""} }
' x.xml
0 голосов
/ 09 октября 2019

Да, в моем случае это было решение:

xmllint --shell x.xml <<< 'xpath //A_tag//C_tag/ancestor::A_tag'

Это потому, что моя xmllint версия не поддерживает --xpath вариант. Кроме того, C_tag может быть любым потомком A_tag, а не просто прямым ребенком (что я не уточнил в вопросе). Тем не менее, ответ dash-o представляется правильным.

Моя единственная проблема в том, что этот xml-файл, с которым я работаю, содержит 4,5 миллиона строк, где xmllint оказался медленным - так же, как и он. Разбор файла.

Если у вас есть более общее решение, которое работает с awk или pcregrep, пожалуйста, поделитесь со мной. Они были бы хороши здесь, поскольку они просто работают с шаблонами.

В противном случае я приму оригинальный ответ завтра.

...