我正在使用linux shell脚本,使用grep
在xml文件中查找信息。我在Mac上,我希望无关紧要。
为了找到我需要的信息,我运行:
grep -oP "<title>(.*)</title>" temp.xml
我得到一个匹配列表,其中包含<title>
标记。
如何使用grep获取仅包含title
标记内的信息但没有 title
标记的列表?
答案 0 :(得分:18)
由于您已使用grep -P
,为什么不使用其功能?
grep -oP '(?<=<title>).*?(?=</title>)'
在一般情况下,XPath是正确的解决方案,但对于玩具场景,是弗吉尼亚州,它可以完成。
答案 1 :(得分:3)
这不是最好的解决方案,我会在bash中搜索XML lib,但你可以这样做:
grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
答案 2 :(得分:3)
我不明白你为什么要使用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
。
答案 3 :(得分:1)
答案 4 :(得分:0)
grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
答案 5 :(得分:0)
您可以使用以下任何命令来获取标签之间的值。
grep -oP '(>).*?(?=</title>)' test.xml | cut -d ">" -f 2
grep -oP '(?<=title>).*(?=</title)' test.xml
awk -F "[><]" '/title/{print $3}' test.xml