代码之家  ›  专栏  ›  技术社区  ›  Bozhidar Marinov

获取标记值的Bash脚本

  •  1
  • Bozhidar Marinov  · 技术社区  · 8 年前

    如果我只有xml文件中描述的标记(“answer\u Yes”或“answer\u No”),是否有任何方法可以获取值(Yes或No)。我想用bash获取它们。

    <string tag="answer_yes" value="Yes"/>
    <string tag="answer_no" value="No"/>
    
    4 回复  |  直到 8 年前
        1
  •  3
  •   choroba    8 年前

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

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

    但它似乎并没有扩展实体,所以如果实际字符串包含引号,则必须替换 &quot; , &amp; &lt; 通过 " , & < 分别地

    xsh 为您处理实体:

    xsh -aC 'open file.xml; $answer={$ARGV[0]};
             echo //string[@tag=$answer]/@value' "$answer"
    
        2
  •  2
  •   Charles Duffy    8 年前

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

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

    这将在基于简单正则表达式的方法无法识别的情况下起作用:它将识别注释和CDATA,并避免试图解析它们;它将忽略 answer_ 不在 string 或a tag ; 它将识别通过DTD引入的别名;它会适当改变 &amp; & 输入输出;不可知的是 标签 或者 价值 在元素中首先给出;它不关心将元素与其属性分隔开的空格是否是制表符/空格/换行符等;等等

        3
  •  0
  •   RavinderSingh13 Nikita Bakshi    8 年前

    在里面 sed 如果您的Input\u文件与所示示例相同,则以下内容可能会对您有所帮助。

    sed 's/.*answer_//;s/".*//'  Input_file
    
        4
  •  0
  •   hjkatz    8 年前
    regex='tag="answer_yes"[[:space:]]+value="([^"]+)"'
    
    if [[ '<string tag="answer_yes" value="Yes"/>' =~ $regex ]] ; then
        echo "${BASH_REMATCH[1]}" ;
    fi
    

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

    资料来源: