【发布时间】:2012-07-12 15:23:51
【问题描述】:
我需要对 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 机器。
我怎样才能得到我想要的数据?
【问题讨论】: