![搜索并仅打印匹配的模式](https://linux22.com/image/1264847/%E6%90%9C%E7%B4%A2%E5%B9%B6%E4%BB%85%E6%89%93%E5%8D%B0%E5%8C%B9%E9%85%8D%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
我有一些巨大的 xml 文本文件。我需要编写一个脚本来查找并仅打印特定标签。我试过了sed
,grep
但它们都返回整行。
使用 SunOS 5.x,因此并非所有 Linux 命令都有效。 grep -o
不可用。
“xml”文件实际上并不是一个巨大的 xml 文档,而是每一行都是一个单独的 xml 文档,只有几个标签,甚至没有嵌套。而且结构相当简单,因此不需要完整的 xml 解析器,而且可能不会起作用。
我正在寻找sed
、awk
或其他一些单行代码,但无法让它们工作,而且它们对我来说都比较新。
答案1
您应该使用专门用于解析 XML 文件的工具,但是这里有一个示例说明如何执行此操作sed
:
给定一个简单的行,例如<foo>bar</foo><baz>qux</baz>
,并且您想要值“bar”,您可以这样做:
sed -e 's|.*<foo>\([^<]*\)</foo>.*|\1|' inputfile
答案2
使用 xmlstarlet 的‘xml sel’命令:http://xmlstar.sourceforge.net/
例子:
xml sel -t -c '/xpath/to/my/tag' xmlfile.xml
不过,请注意 xml 文件中的默认命名空间(阅读这)。 一个例子:
xml sel -N x="http://www.mozilla.org/2006/browser/search/" -t -m '//x:Param' -c "." -n /usr/lib/firefox-3.5/searchplugins/google.xml
我现在使用 xmlstarlet 执行所有 xml 任务,主要是查询。
答案3
$ echo '<a><b>B</b><c>C</c></a>' > file.xml $ perl -ne 'm!<b>(.*)</b>! && 打印 "$1\n"' *.xml 乙 $ perl -ne 'BEGIN{$/="<"}; 如果 m![bc]>([^<]+)<!' *.xml 则打印“$1\n” 乙 C
但实际上您应该使用 XML 解析器,原因应该(或将变得)非常明显。
答案4
两个想法:
从以下位置安装 grepsunfreeware.com. 这应该会让您获得从 Linux 中了解的 -o 选项。
编写一个 perl 或 python 脚本来完成这项工作。