【发布时间】:2015-02-02 13:30:35
【问题描述】:
我有一个如下的 xml 标签:
<Setting Name="Check" Type="xsd:integer">53</Setting>
我只需要用最好的代码获取 53 个。有人可以推荐吗?
我知道可以实现如下:
grep "Setting Name=\"Check\"" abc-test.xml | cut -d'>' -f 2 | cut -d'<' -f 1
谢谢
【问题讨论】:
我有一个如下的 xml 标签:
<Setting Name="Check" Type="xsd:integer">53</Setting>
我只需要用最好的代码获取 53 个。有人可以推荐吗?
我知道可以实现如下:
grep "Setting Name=\"Check\"" abc-test.xml | cut -d'>' -f 2 | cut -d'<' -f 1
谢谢
【问题讨论】:
对于这类任务,我总是建议使用 xml 解析器,例如 xmlstarlet 并使用 xpath 表达式。一个例子:
xmlstarlet sel -t -v '/Setting[@Name="Check"]/text()' abc-test.xml
产生:
53
更新 xmllint 版本:
xmllint --xpath '/Setting[@Name="Check"]/text()' abc-test.xml
【讨论】:
xmllint,替换二进制文件及其参数,但替换xpath 表达式和输入文件。但在找到您的工具箱之前,我不会尝试。你最好访问这个how to parse xml from shell并选择一个。
可能的代码如下..我不知道这是否最适合你。
使用 sed
sed '/Setting Name="Check"/{s/^[^>]\+>\([0-9]\+\)<.*/\1/g}'
示例
echo '<Setting Name="Check" Type="xsd:integer">53</Setting>'|sed '/Setting Name="Check"/{s/^[^>]\+>\([0-9]\+\)<.*/\1/g}'
使用 awk
awk -v FS="<[^0-9]+>" '$0~"Setting Name=\"Check\""{print $2}'
示例
echo '<Setting Name="Check" Type="xsd:integer">53</Setting>'|awk -v FS="<[^0-9]+>" '$0~"Setting Name=\"Check\""{print $2}'
【讨论】:
只有grep 命令
grep -oP '(?<=>).*?(?=</Setting>)' input.xml
对于扩展条件(即:检查)您也可以像这样提及元素,
grep "Name=\"Check\"" input.xml|grep -oP '(?<=>).*?(?=</Setting>)'
输出将是,
53
这是我尝试过的,
【讨论】: