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

如何使用grep查找xml标记中的信息?,xml,regex,shell,grep,Xml,Regex,Shell,Grep,我正在编写一个bash脚本,从xml文件中提取一些信息。我正在为此使用grep 要查找我需要的信息,我运行: grep -oP "<title>(.*)</title>" temp.xml grep-oP“(.*)”temp.xml 我得到一个匹配列表,其中包括标记 如何使用grep获取只包含title标记内的文本而不包含title标记的列表?这不是最好的解决方案,我会在bash中搜索XML lib,但您可以: grep -oP "<titl

我正在编写一个bash脚本,从xml文件中提取一些信息。我正在为此使用
grep

要查找我需要的信息,我运行:

grep -oP "<title>(.*)</title>" temp.xml
grep-oP“(.*)”temp.xml
我得到一个匹配列表,其中包括
标记


如何使用grep获取只包含
title
标记内的文本而不包含
title
标记的列表?

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

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

grep-oP“(.*)”temp.xml | cut-d“>”-f2 | cut-d“我不明白您为什么要使用grep来实现这一点,而这可以通过一个简单的XPath表达式来解决:

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

答案列出了一些这样的工具

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>

如果你知道你正在处理一个琐碎的文档,并且格式没有改变,或者如果这是一项一次性工作,你可以快速验证结果,你可以像其他人解释的那样使用
grep

既然你已经使用了
grep-p
,为什么不使用它的功能呢

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

grep-oP'(?您可以按照的答案中的建议使用xpath安装xgrep


grep-oP“(.*)”XML.XML“| sed-n的/*\([^您可以使用以下任何命令获取标记之间的值

grep-oP'(>).*(?=)'test.xml | cut-d“>”-f2


grep-oP'(?).*(=为什么不改用XPath?它必须是一个快速的脚本编写工作,我不想在上面花费太多时间。你能推荐一个好的XPath命令行工具吗?看起来我已经在这里安装了xpath5.12。没有手动输入,尽管其中任何一个都足够。你的XPath应该尽可能简单'//title/text()没错,我不知道xpath是一个命令行工具。这也是我的解决方案。但现在grep-P是obsolete@Bharat过时??你能提供一个参考吗?我发现OSX选择删除有用的功能这一事实并不表明该功能已经过时。没有迹象表明它将从GNU
grep
whi中删除如果您需要,ch很容易安装在OSX上,现在在大多数其他平台上也是标准的。-
(?支持XPath的命令示例有xgrep()、xmlgrep()或sgrep()。在以“使用grep”结尾的(明确的)问题中,您不明白什么"?答案中有什么你不明白的地方,它提供了一个有用的答案,解决了问题的核心,而不是OP所做的假设。为什么它会困扰你?问一个关于橙子的问题,而被接受的答案是关于香蕉的。很好。这里有一个提示:提示放在评论中,而不是答案中。我正在使用一个没有提示的服务器有xpath,也没有xmlstarlet,但它有grep。这就是为什么我要寻找grep答案而不能使用xpath。
grep -oP '(?<=<title>).*?(?=</title>)'
grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"