0

我需要对 XML 文件中包含的数据进行 grep。我需要获取多个元素,最后一个在节点内。我正在研究的元素之间有一堆数据。我可以轻松地 grep 像这样的多个元素:

grep -E "<first|<second|<third|<seventh" file.xml

但是因为我有一个看起来像这样的文件结构:

<first>First</first>
<second>Second</second>
<third>Third</third>
<fourth>Fourth</fourth>
<fifth>Fifth</fifth>
<sixth flexible="true">
    <low>0.09</low>
    <high>5.90</high>
</sixth>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

我没有得到<seventh>节点内的数字数据(没想到用那个命令)。所以我试图使用grep -An(之后)开关,其中“n”是初始匹配后要匹配的行数,以获得第七个节点的其余部分:

grep -E "<first" -E "<second" -E "<third" -E -A3 "<seventh" file.xml

哪个会返回:

<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

然后我可以对其进行按摩以获得最终结果(实际上只需要来自第七个节点的“高”数据及其关联的第一个、第二个和第三个字符串)。但是,这不起作用,我立即得到前三个元素<first,它忽略了命令的其余部分。

我也试过:

grep -E "<first|<second|<third" -E -A3 "<seventh" file.xml

这给了我类似的结果,但完全忽略了-E -A3 "<seventh命令的“”部分。好吧,我想不会忽略,因为 -A3 仍在向后应用到命令的前面部分。我知道您可以使用命令后开关,但是您可以控制它们回退多远吗?

我通读了 grep 上的手册页,但没有看到如何将命令链接在一起。如果这很重要,我正在使用 Mac,但如果需要,可以轻松访问 Linux 和 Windows 机器。

我怎样才能得到我想要的数据?

4

2 回答 2

1

首先,请man grep再看一遍,发现-E不需要多个,并且不需要多个模式grep

其次,如果你知道你需要上下文seventh而不是其他人,只需使用两个命令:

$ grep -E '<first|<second|<third' file.xml; grep -A3 '<seventh' file.xml
<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

如果您实际上不知道,那么最好使用xpath其他 xml 解析工具。

另请参阅此问题

于 2012-07-11T23:38:08.093 回答
0

不要使用正则表达式来搜索 XML。它们不是为这项工作而设计的。您的代码将是错误的。例如,如果某些字符串出现在注释或 CDATA 部分中,或者输入包含名为 的元素<firstly>,或者换行符的排列方式不同,@Levitsky 给出的代码将失败。(有时代码错误并不重要,因为只有 99% 的时间可以工作,但如果这是你的要求,我希望你能这么说。)

搜索 XML 的方法是使用 XPath,或者对于更精细的搜索,使用 XQuery。

满足您需求的 XPath 解决方案非常简单。假设您提供的 XML 在wrapper元素内,则 XPath 2.0 表达式为wrapper/(first, second, third, seventh). 所以这个任务的 XPath 不仅更可靠,而且也更容易。

于 2012-07-12T07:23:51.770 回答