如果存在内部标记,则提取外部标记信息

时间:2013-10-29 09:12:51

标签: xml sed awk

我有这个简单的xml文件。我知道sed或awk不是最好的选择,但我仅限于使用它们。

<testcase classname="i1" name="item1"/>
<testcase classname="i2" name="item2">
   <failure message="value2">
   </failure>
</testcase>
<testcase classname="i3" name="item3"/>

如您所见,有些是自闭式的(如第1项,第3项),有些则包含<failure>标签。
当且仅当内部有name标记时,我想获取第一个testcase标记的<failure>属性。
此示例的期望结果应为item2 我用过的是:

sed -rn 's#.*[<testcase].*[ ]name=[\"]([0-9a-zA-Z_]+)[\" ].*[<failure message=][\"]([0-9a-zA-Z_]+)[\" ].*[<\/failure>].*[<\/testcase>]#\1#p' file.xml

这对于正则表达式来说真的不是一个明智的用途,但有时我会得到奇怪的结果 我是在正确的方向来解决这个问题吗? 谢谢!

编辑:添加了classname属性,因为选中的答案给我打了两行显示

i2
i2

而不是item2

1 个答案:

答案 0 :(得分:0)

有些人喜欢awk

awk -F\" '/<failure message/ {print s} / name/ {s=$4}' file.xml
item2

如果找到<failure,请打印上一个name值。

awk -F\" '                          # Set the filed sepatator to " (makes it easy to get data)
    /<failure message/ {print s}    # Search for "failure" and if found, print value of s
    / name/ {s=$4}                  # Search for "name" and if found, set s = name filed
    ' file.xml                      # Input file

编辑: 添加此版本以获取正确的name字段,即使行数更改

awk '/<failure/ {print s} /^ name/ {getline;s=$0}' RS=\" file.xml