XML 上下文 grep

XML 上下文 grep

以下是我的文件的内容,

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

如果我 grep for Word1,我试图看到如下输出,

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

如果我 grep for Word2,我试图看到如下输出,

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

有人可以帮忙吗?

答案1

如果这是格式良好的 XML 文档的一部分,您可以使用 XML 解析器提取所需的部分。

为了满足结构良好要求,我已经用<root>和包装了您的 XML 片段</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'

(尽管这意味着整个文件被加载到内存中并假设它不包含 NUL 字节)。

一些 PCRE 运算符:

  • (?s)打开s标志(.匹配偶数行分隔符)
  • .(?!</A>)任何字符,前提是它不在 的开头</A>
  • .*?非贪婪版本.*
  • (:...)只是分组。

<![CDATA[</A>]]>它被诸如或 找不到需要 XML 解析器的Word2表达为<![CDATA[W]]>ord2>或之类的东西所愚弄。&#87;ord2但是,XML 解析器将需要有效的 XML 输入,而您的示例则不需要,除非您将其包含在顶级元素中,否则需要完整读取该文件(但话又说回来,这通常是您在使用该格式时的工作)并且将可能会改变内容(扩展<![CDATA和一些&...;序列)。 Xpath 表达式会导致很难在任何地方找到这些表达式,Word1包括在注释、XML 标记或属性中。

相关内容