用于获取标记值的Bash脚本

时间:2018-01-24 16:05:04

标签: xml bash shell

如果我只有xml文件中描述的标签(" answer_yes"或" answer_no"),有没有办法获得价值(是或否)。我想用bash来获取它们。

<string tag="answer_yes" value="Yes"/>
<string tag="answer_no" value="No"/>

4 个答案:

答案 0 :(得分:3)

使用支持XML的工具。对于这个简单的查询,xmllint就足够了:

answer=answer_yes
xmllint --xpath "//string[@tag='$answer']/@value" file.xml | cut -f2 -d\"

似乎不会扩展实体,因此,如果您的真实字符串包含引号,则必须将&quot;&amp;&lt;替换为{{1分别是{},"&

xsh为您处理实体:

<

答案 1 :(得分:2)

要在XML文档中使用valuetag="answer_yes"提取所有字符串的tag="answer_no"元素,XMLStarlet是一个合适的工具:

xmlstarlet sel -t -m '//string[@tag="answer_yes" or @tag="answer_no"]' -v '@value' -n

这适用于天真的基于正则表达式的方法不会:它会识别注释和CDATA,并避免尝试解析它们;它会忽略不在answer_string内的tag内容;它会识别通过DTD引入的别名;它会在输出中正确地将&amp;更改为&;它是否与元素中首先给出tagvalue无关;它不关心将元素与其属性分隔的空格是tabs / spaces / newlines / etc;等等。

答案 2 :(得分:0)

sed中,如果您的Input_file与显示的示例相同,那么以下内容可能对您有帮助。

sed 's/.*answer_//;s/".*//'  Input_file

答案 3 :(得分:0)

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 3, column 29

随意扩展正则表达式以获得更准确的匹配。

来源: