搜索并仅打印匹配的模式

搜索并仅打印匹配的模式

我有一些巨大的 xml 文本文件。我需要编写一个脚本来查找并仅打印特定标签。我试过了sedgrep但它们都返回整行。

使用 SunOS 5.x,因此并非所有 Linux 命令都有效。 grep -o不可用。

“xml”文件实际上并不是一个巨大的 xml 文档,而是每一行都是一个单独的 xml 文档,只有几个标签,甚至没有嵌套。而且结构相当简单,因此不需要完整的 xml 解析器,而且可能不会起作用。

我正在寻找sedawk或其他一些单行代码,但无法让它们工作,而且它们对我来说都比较新。

答案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

两个想法:

  1. 从以下位置安装 grepsunfreeware.com. 这应该会让您获得从 Linux 中了解的 -o 选项。

  2. 编写一个 perl 或 python 脚本来完成这项工作。

相关内容