
Ниже приведено содержимое моего файла.
<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>
или Word2
для которого вам понадобится XML-анализатор. Но тогда XML-анализатору понадобятся допустимые входные данные XML, которыми ваш пример не является, если только вы не заключите его в элемент верхнего уровня, ему нужно будет прочитать файл полностью (но опять же, это обычно ваша участь при работе с этим форматом) и потенциально преобразовать содержимое (расширить <![CDATA
и некоторые &...;
последовательности). А выражение xpath затруднит их поиск Word1
где угодно, включая комментарии, XML-теги или атрибуты.