有许多用于XPath的命令行工具,它们通常与操作系统捆绑在一起。 this question on Stack Overflow的答案列出了许多这样的工具。 grep的问题在于它是一个通用的文本处理工具,不知道任何XML结构。对于一个非常简单的场景,您可以使用get it working。如果文档很复杂,或者如果您在一个脚本中使用它,而不是一次性的工作,那么您最终可能会对结果感到遗憾。 XPath使得区分文档中不同上下文中出现的名称相似的标记变得很容易。
<article>
<author>
<name>Jon Doe</name>
<title>Chief Editor</title>
</author>
<title>On the Benefits of grep</title>
<publicationDate>2018-02-12</publicationDate>
<text>blah blah blah</text>
</article>
7条答案
按热度按时间uyhoqukh1#
既然您已经使用了
grep -P
,为什么不使用它的特性呢?在一般情况下,XPath是正确的解决方案,但对于玩具场景,是的,弗吉尼亚州,它可以做到。
zzlelutf2#
我不明白为什么要使用grep来实现这个问题,而它可以用一个简单的XPath表达式来解决:
有许多用于XPath的命令行工具,它们通常与操作系统捆绑在一起。
this question on Stack Overflow的答案列出了许多这样的工具。
grep
的问题在于它是一个通用的文本处理工具,不知道任何XML结构。对于一个非常简单的场景,您可以使用get it working。如果文档很复杂,或者如果您在一个脚本中使用它,而不是一次性的工作,那么您最终可能会对结果感到遗憾。XPath使得区分文档中不同上下文中出现的名称相似的标记变得很容易。
如果您使用此处发布的任何其他答案,则使用
grep
提取此文档所代表的文章标题将失败。从技术上讲,您可以编写正则表达式来获取所需内容,但使用XPath要容易得多。如果您知道您正在处理一个普通的文档,并且格式不会改变,或者如果它是一个一次性的工作,您可以快速验证结果,那么您可以像其他人解释的那样选择
grep
。shstlldc3#
这不是最好的解决方案,我会在bash中搜索XML lib,但您可以这样做:
8fsztsew4#
ljo96ir55#
您可以按照Tom的回答中的建议使用xpath安装xgrep
man xgrep
gajydyqb6#
您可以使用以下任何命令来获取标记之间的值。
grep -oP '(>).*?(?=</title>)' test.xml | cut -d ">" -f 2
grep -oP '(?<=title>).*(?=</title)' test.xml
awk -F "[><]" '/title/{print $3}' test.xml
k2fxgqgv7#
使用gawk工具,例如:gawk '开始{ RS="〈[^〉]+〉”} {打印实时时间,$0 }'我的文件