在bash提示符上,我希望运行xmllint从xml文件中获取数据。让我们来看看我没有问题的文件:
查看fruits.xml文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="mykey">grapes</string>
</map>这就是我使用xmllint从fruits.xml获得“葡萄”的价值。
xmllint --xpath "string(/map/string[@name = 'mykey'])" fruits.xml我得到了以下的输出:
$ grapes很好,我得到了这个值,但这不是我需要使用的实际键。"mykey“应该是”C1:果树_id-%1$s“。
现在,当我将fruits.xml文件中的"mykey“值更改为另一个值时,我无法从xmllint获得任何返回值:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="c1:fruits_id-%1$s">grapes</string>
</map>
xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruits.xml上面的命令没有返回任何内容。我所做的就是改变关键的名字,现在它不能工作了。有人能帮忙吗?
发布于 2016-01-05 20:17:04
(您显示的XML文档在属性值前面没有c1: --我猜是一个错误?)
如果在shell命令中使用$,则会将其解释为变量和变量内插。因为变量不存在,所以它将被替换为nothing。可以通过将XML文档更改为
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="c1:fruits_id-%1">grapes</string>
</map>唯一的改变是删除了两个字符$s。现在,path表达式找到字符串:
$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruit.xml
grapes或者像Biffen所建议的那样,将字符转义为\$:
$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1\$s'])" fruit.xml
grapes或者,同样容易地,交换引号:
$ xmllint --xpath 'string(/map/string[@name = "c1:fruits_id-%1$s"])' fruit.xml
grapes对于由单引号分隔的字符串,即使其中有双引号,也不存在变量内插(请参见this question)。
https://stackoverflow.com/questions/34620075
复制相似问题