【问题标题】:Grep an XML file for certain patterns为某些模式 Grep 一个 XML 文件
【发布时间】:2014-05-07 01:26:27
【问题描述】:

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

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

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

  • grep fizzes_20.xml "&gt;&lt;/&gt;"
  • grep fizzes_20.xml "/&gt;"

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

【问题讨论】:

  • 您不会收到grep: &gt;&lt;/&gt;: No such file or directory 之类的错误吗?文件应该是最后一个参数:grep [OPTIONS] PATTERN [FILE...]
  • 哦等等,这是 Windows。如何在 Windows 98 上安装 grep?

标签: xml linux grep


【解决方案1】:

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 

【讨论】:

  • 我机器上的标志是--pattern。或者,至少,--xpath 不存在。我无法让它工作,所以两者之间可能存在差异。
  • @2rs2ts Odd... 我已经包含了我的 xmllint 版本。
  • 是的,显然这是最近添加的,它们(可能)不等同:stackoverflow.com/questions/91791/…
【解决方案2】:

用这样的模式很容易实现:

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

【讨论】:

  • 一个 XML 文件有时只包含一行(很多 MB)。对结果没那么有用...... .
【解决方案3】:

试试这个命令:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多