shell 如何使用grep查找xml标记内的信息?

fjnneemd  于 2023-02-16  发布在  Shell
关注(0)|答案(7)|浏览(119)

我正在使用bash脚本从xml文件中提取一些信息,为此我使用了grep
为了找到我需要的信息,我运行:

grep -oP "<title>(.*)</title>" temp.xml

我得到一个匹配列表,其中包括<title>标记。
如何使用grep获得只包含title标记内的文本但不包含title标记的**的列表?

uyhoqukh

uyhoqukh1#

既然您已经使用了grep -P,为什么不使用它的特性呢?

grep -oP '(?<=<title>).*?(?=</title>)'

在一般情况下,XPath是正确的解决方案,但对于玩具场景,是的,弗吉尼亚州,它可以做到。

zzlelutf

zzlelutf2#

我不明白为什么要使用grep来实现这个问题,而它可以用一个简单的XPath表达式来解决:

//title/text()

有许多用于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>

如果您使用此处发布的任何其他答案,则使用grep提取此文档所代表的文章标题将失败。从技术上讲,您可以编写正则表达式来获取所需内容,但使用XPath要容易得多。

/article/title/text()

如果您知道您正在处理一个普通的文档,并且格式不会改变,或者如果它是一个一次性的工作,您可以快速验证结果,那么您可以像其他人解释的那样选择grep

shstlldc

shstlldc3#

这不是最好的解决方案,我会在bash中搜索XML lib,但您可以这样做:

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
8fsztsew

8fsztsew4#

grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
ljo96ir5

ljo96ir55#

您可以按照Tom的回答中的建议使用xpath安装xgrep
man xgrep

gajydyqb

gajydyqb6#

您可以使用以下任何命令来获取标记之间的值。
grep -oP '(>).*?(?=</title>)' test.xml | cut -d ">" -f 2
grep -oP '(?<=title>).*(?=</title)' test.xml
awk -F "[><]" '/title/{print $3}' test.xml

k2fxgqgv

k2fxgqgv7#

使用gawk工具,例如:gawk '开始{ RS="〈[^〉]+〉”} {打印实时时间,$0 }'我的文件

相关问题