仅提取XML文件中的值集的最简单方法是什么?例如,XML文件中的数据是
我只想从脚本中显示low。
下面是我使用的sed命令,它返回完整的字符串
sed -n '/cipher_strength/{s/.*//;s/<\/cipher_strength.*Value=""//;p;}' test.xml根据评论,我不能使用xmlstarlet,因为这在我的suse版本中是不可用的,并且被无法安装的供应商锁定。
发布于 2020-03-02 15:42:49
使用命令行XML解析器xmlstarlet:
xmlstarlet sel -t -v '//entry[@key="cipher_strength"]/@value' -nl file.xml这将匹配XML文档中任何位置的所有entry节点,如果同一个entry节点具有一个值为cipher_strength的key属性,则将提取它们的D5属性的值。每个值都将输出一个尾换行符。
在各种系统上可用的xmllint实现似乎在它们对执行XPath查询的支持上有所不同。
在我的OpenBSD系统上,你可以
xmllint --xpath '//entry[@key="cipher_strength"]/@value' file.xml回来
 value="low"但是,我认为xmllint --xpath '//entry[@key="cipher_strength"]/@value/text()' file.xml可能会给出字符串low,但它似乎不起作用(只生成一个XPath set is empty响应)。
只要value属性的值是“很好的”,就应该能够对此输出进行按摩,以提取实际值:
$ xmllint --xpath '//entry[@key="cipher_strength"]/@value' file.xml | sed -e 's/^[^"]*"//' -e 's/"$//'
low上面的sed表达式删除到第一个双引号字符之前的所有内容,然后从每一行中删除最后一个双引号字符。
其他xmllint实现/版本可能采用使用xmllint --shell的方式:
xmllint --shell file.xml <<<'cat //entry[@key="cipher_strength"]/@value' |
sed -e '/^[^ ]/d' -e 's/^[^"]*"//' -e 's/"$//'发布于 2020-03-03 08:11:53
如果没有专用的XML工具可用,您可能需要使用awk:调用
user@host~$ awk '/key="cipher_strength"/ {for (i=1;i<=NF;i++) { if (split($i,parts,"=")==2 && parts[1]=="value") print parts[2]}}' file.xml将查找所有包含key="cipher_strength"的行,然后在=符号处拆分所有空格分隔的字符串。对于所有包含该符号“在中间”(即前面有一部分,后面有一个部分)的人,检查第一部分是否等于value,如果等于,则打印第二个。为了你的意见,我得到了
user@host~$ awk '/key="cipher_strength"/ {for (i=1;i<=NF;i++) { if (split($i,parts,"=")==2 && parts[1]=="value") print parts[2]}}' file.xml
"low"如果有更多的节点,您可以尝试修改程序,以确保您在应用此操作之前处于正确的位置。
https://unix.stackexchange.com/questions/570431
复制相似问题