0

我有这个简单的 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<failure>
item2

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

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

编辑:添加了类名属性,因为选择的答案让我显示了两个打印行

i2
i2

代替item2

4

1 回答 1

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
于 2013-10-29T09:19:15.017 回答