我们想要从XML文件中读取XML属性。文件内容示例如下:
<properties>
<property name="abc" value="15"/>
<property name="xyz" value="26"/>
</properties>
我们想要阅读财产的价值(即15)&#34; abc&#34;使用shell脚本。
请建议使用shell命令来实现此目的。
答案 0 :(得分:6)
您可以使用正确的XML解析器,例如xmllint。如果您的版本支持xpath,则可以非常轻松地获取特定值。如果它不支持xpath,那么您可以使用--shell
选项,如下所示:
$ echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxml
/ > -------
value="15"
/ >
然后,您可以使用awk
或sed
格式化并从输出中提取所需的字段。
$ echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxmlfile | awk -F'[="]' '!/>/{print $(NF-1)}'
15
您可以使用命令替换来捕获变量中的输出:
$ myvar=$(echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}')
$ echo "$myvar"
15
使用除xmlparser之外的任何其他内容都容易出错并且容易破解。
答案 1 :(得分:1)
快速而肮脏
sed -n '/<Properties>/,\|</properties>| {
s/ *<property name="xyz" value="\([^"]*\)"\/>/\1/p
}'
没有xml检查,并根据您的样本,因此假设相同的结构(每行一个属性名称,...)
posix版本(GNU sed为--posix
)
答案 2 :(得分:0)
sed -n '/<property name="abc"/s/.*value="\(.*\)"[^\n]*/\1/p' file
为值创建保持模式然后匹配除换行符之外的所有内容以避免打印换行符,它期望根据示例数据双引号。
E.g.
<properties>
<property name="abc" value="15"/>
<property name="xyz" value="26"/>
</properties>
Output:
15
(编辑之前:sed '/<property name="abc"/s/.*value="\(.*\)"[^\n]*/\1/' file
)