我有一个包含数万个相同元素的大型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 "/>"
有什么想法吗?提前谢谢!
答案 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
匹配标记开头和标题,.*
匹配任何属性,括号中的最后一部分匹配自闭标记或没有内容的标记。希望这有帮助!