2012-07-11 71 views
0

我需要为包含在XML文件中的数据grep。我需要获取多个元素,最后一个元素位于节点内。我正在琢磨的元素之间有一堆数据。我可以很容易地用grep的多个元素,像这样:如何grep多个字符串与-A

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操作系统&。

如何获取我想要的数据?

回答

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解析工具。请参阅this question

+0

感谢您的帮助,但是您的解决方案无法为我提供我正在查找的数据。您和迈克尔对xpath的建议看起来是解决问题的好方法。实际上,我做了一个蛮力的grep&sed脚本来让数据进入可管理的状态。像这样: 'grep -E -A3“<第一|第二|第三|第七”file.xml | sed -e's/ //'-e's/ //'-e's/ //'-e's/^ [ \ t] * //'-e'/^.*$/ s''因为我在每个搜索词后面都有3行,所以我得到了太多的数据并使用sed来清理它。这很好,所以我可以继续前进。 – delliottg 2012-07-13 16:46:28

0

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

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

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

+0

感谢您的帮助。 Xpath非常可行,但由于我没有使用XML解析器,与真实的XML相比,我使用的XML示例过于简化。我昨天进行了实验并得出了真正的XML结果,但我只能得到序列化的数据(EG所有节点数据,其后是所有节点数据等),而不是关联数据: '代码首先 <第七弹性= “假”> 1.82 3.14 ' 使用逗号给了我一个 “无效的标记:” 标记错误。 – delliottg 2012-07-13 16:35:56