我有几个非常大(10GB)的 xml 文件,具有以下结构。如您所见,该文件包含一系列记录。我想做的是根据一个或多个属性搜索记录。问题是一个简单的 grep 会给我包含该属性的行。因此,例如,grep 可能会给我第 100 行、第 300 行等等。但是,我需要的是提取相关记录元素的能力,而不仅仅是匹配的行。是否有任何 Unix 实用程序可以提供帮助?
<records>
<record seq="1">
<properties>
<property name="AssetId">1234</property>
</properties>
<message>messsage1</message>
</record>
<record seq="2">
<properties>
<property name="VI-ID">4567</property>
</properties>
<message>message2</message>
</record>
<records>
最佳答案
xmlstarlet
允许您从 shell 脚本运行 XPath;这是一个完美的用例。
例如:
xmlstarlet sel -t \
-m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
-c .
将打印 AssetId 属性为 1234 的整个记录。
如果你想在一次传递中进行多次匹配,这也是支持的:
xmlstarlet sel \
-t -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
-c . -n -n \
-t -m '//record[properties/property/@name="VI-ID"]' \
-c . -n -n \
<input.xml
...此版本将打印 AssetID 为 1234 的记录,或带有任何值的 VI-ID
的任何记录,并在每条记录后放置两个换行符。
关于xml - 在 linux 中搜索 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439929/