Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何使用-A grep多个字符串_Xml_Unix_Grep - Fatal编程技术网

Xml 如何使用-A grep多个字符串

Xml 如何使用-A grep多个字符串,xml,unix,grep,Xml,Unix,Grep,我需要grep查找XML文件中包含的数据。我需要获取多个元素,最后一个元素位于节点内部。在我正在浏览的元素之间有一堆数据。我可以轻松地grep多个元素,如: grep -E "<first|<second|<third|<seventh" file.xml 这将返回: <first>First</first> <second>Second</second> <third>Third</third>

我需要grep查找XML文件中包含的数据。我需要获取多个元素,最后一个元素位于节点内部。在我正在浏览的元素之间有一堆数据。我可以轻松地grep多个元素,如:

grep -E "<first|<second|<third|<seventh" file.xml
这将返回:

<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>
首先
第二
第三
1.82
3.14

然后我可以对其进行按摩以获得最终结果(实际上只需要来自第七个节点的“高”数据及其关联的第1、第2和第3个字符串)。但是,这不起作用,我将在
之后立即获得前三个元素。首先,请再次查看
man grep
,发现不需要多个
-E
,并且
grep
不需要多个模式

其次,如果您知道您需要第七个
的上下文,但不需要其他上下文,只需使用两个命令:

$ 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>

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

搜索XML的方法是使用XPath,或者对于更复杂的搜索,使用XQuery


满足您需求的XPath解决方案非常简单。假设您提供的XML位于
包装器
元素中,XPath 2.0表达式是
包装器/(第一、第二、第三、第七)
。因此,用于此任务的XPath不仅更可靠,而且更简单。

感谢您的帮助。Xpath非常可行,但因为我没有使用XML解析器,所以我使用的XML示例与真正的XML相比过于简化。我昨天用它做了实验,从真正的XML中得到了结果,但我只能得到序列化数据(例如所有节点数据后面跟着所有节点数据等等),而不是关联数据:
code First Second Third 1.82 3.14
使用逗号给了我一个“无效令牌:”,令牌错误。感谢您的帮助,但你的解决方案无法提供我所需的数据。您的&Michael关于xpath的建议看起来是解决这个问题的好方法。实际上,我编写了一个蛮力grep&sed脚本,以使数据处于可管理状态。类似这样:
grep-E-A3“
<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>
grep -E "<first|<second|<third" -E -A3 "<seventh" file.xml
$ 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>