为某些模式Grep XML文件

时间:2013-03-21 01:29:38

标签: xml linux grep

我有一个包含数万个相同元素的大型XML文件:

<rootElem>
    <fizz buzz="true">234</fizz>
    <fizz buzz="false">384</fizz>
    <fizz buzz="true"></fizz>
    <fizz buzz="true">39494</fizz>
    <fizz/>
</rootElem>

我想运行grep打印出不包含文本/正文数据的任何<fizz>元素(开头和结束标记之间的数字)。在上面的示例中,grep将为不包含数字数据的第3个和第5个<fizz>元素生成2行。文件名为fizzes_20.xml。我尝试运行以下但无济于事:

  • grep fizzes_20.xml "></>"
  • grep fizzes_20.xml "/>"

有什么想法吗?提前谢谢!

3 个答案:

答案 0 :(得分:3)

xmllint命令可用于为空节点实现xpath表达式测试:

$ xmllint --xpath "//fizz[not(text())]" data.xml 
<fizz buzz="true"/><fizz/>

更新

$ xmllint --version
xmllint: using libxml version 20901
   compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma 

答案 1 :(得分:1)

使用这种模式很容易实现:

grep -E '<fizz/>|<fizz.*><' fizzes_20.xml

答案 2 :(得分:0)

尝试此命令:

egrep '<fizz.*(/>|></fizz>)' fizzes_20.xml

<fizz匹配标记开头和标题,.*匹配任何属性,括号中的最后一部分匹配自闭标记或没有内容的标记。希望这有帮助!