Контекстный поиск XML

Контекстный поиск XML

Ниже приведено содержимое моего файла.

<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>

если я выполняю grep для Word1, я пытаюсь увидеть вывод, как показано ниже,

<A>
<number>100</number>
<name>Word1</name>
</A>

если я выполняю grep для Word2, я пытаюсь увидеть вывод, как показано ниже,

<A>
<number>101</number>
<name>Word2</name>
</A>

Кто-нибудь может с этим помочь?

решение1

Если это часть правильно сформированного XML-документа, вы можете извлечь необходимую часть с помощью XML-анализатора.

Чтобы удовлетворитьхорошо сформированныйтребование, я заключил ваш XML-фрагмент в <root>и </root>.

xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml

Если вы не можете удовлетворить это напрямую, вы можете явно это обернуть

( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n

В любом случае вывод будет следующим:

<A>
<number>100</number>
<name>Word1</name>
</A>

решение2

С pcregrep:

<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'

С GNU grep:

<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '\0' '\n'

(хотя это означает, что весь файл загружается в память и предполагается, что он не содержит нулевых байтов).

Некоторые операторы PCRE:

  • (?s)включает sфлаг ( .соответствует четным разделителям строк)
  • .(?!</A>)любой символ, если он не находится в начале </A>.
  • .*?нежадная версия.*
  • (:...)просто группировка.

Его обманывают такие вещи, как <![CDATA[</A>]]>или не найдёт Word2выраженный как <![CDATA[W]]>ord2>или &#87;ord2для которого вам понадобится XML-анализатор. Но тогда XML-анализатору понадобятся допустимые входные данные XML, которыми ваш пример не является, если только вы не заключите его в элемент верхнего уровня, ему нужно будет прочитать файл полностью (но опять же, это обычно ваша участь при работе с этим форматом) и потенциально преобразовать содержимое (расширить <![CDATAи некоторые &...;последовательности). А выражение xpath затруднит их поиск Word1где угодно, включая комментарии, XML-теги или атрибуты.

Связанный контент