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

Fil*_*ype 12 regex xml shell grep

我正在使用linux shell脚本来查找xml文件中的信息grep.我在Mac上,希望无关紧要.

为了找到我需要的信息,我运行:

grep -oP "<title>(.*)</title>" temp.xml
Run Code Online (Sandbox Code Playgroud)

我得到一个匹配列表,其中包括<title>标签.

我怎样才能得到只有内部信息的列表title标记,但没有title使用grep的标签?

tri*_*eee 21

既然您已经使用过grep -P,为什么不使用它的功能呢?

grep -oP '(?<=<title>).*?(?=</title>)'
Run Code Online (Sandbox Code Playgroud)

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

  • OSX选择删除有用功能的事实几乎不表明该功能已过时.没有任何迹象表明它会从GNU`grep`中删除,如果你需要它,它很容易在OSX上安装,而且现在大多数其他平台都是标准配置. (3认同)
  • @巴拉特过时了吗?你能提供参考吗? (2认同)

ton*_*edz 7

我不明白你为什么要为此使用 grep,而它可以用一个简单的 XPath 表达式解决:

//title/text()
Run Code Online (Sandbox Code Playgroud)

XPath 有许多命令行工具,它们通常与操作系统捆绑在一起。

Stack Overflow 上这个问题的答案列出了许多这样的工具。

grep这里的问题在于它是一个用于文本处理的通用工具,它不知道任何 XML 结构。对于一个非常简单的场景,你可以让它工作。如果文档很复杂,或者如果您在脚本中使用它而不仅仅是一次性工作,那么您可能会对结果感到遗憾。

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>
Run Code Online (Sandbox Code Playgroud)

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

/article/title/text()
Run Code Online (Sandbox Code Playgroud)

如果你知道你正在处理一个琐碎的文档并且格式没有改变,或者如果它是一项可以快速验证结果的一次性工作,你可以grep按照其他人的解释去做。

  • 在以“使用 grep”结尾的(明确的)问题中,您有什么不明白的地方? (5认同)
  • 问一个关于橙子的问题,公认的答案是关于香蕉的。好的。这是一个提示:_提示在评论中_,而不是答案。 (3认同)
  • 您在回答中没有理解什么,为解决问题核心的问题提供了有用的答案,而不是 OP 所做的假设。为什么会困扰你? (2认同)

hov*_*yan 6

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

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
Run Code Online (Sandbox Code Playgroud)