2013-10-29 24 views
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>标签。
我想获得第一个testcase标签的name属性,当且仅当内部有<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

回答

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 
+0

是的,这样做的工作...... O_O能否请您详细阐述申请有关这个代码?即为什么它解决了我的问题? – bomba6

+1

添加说明信息。如果你喜欢它接受它:) – Jotne

+0

谢谢Jotne,我会接受这一点。我更新了我的问题,因为我忘记了另一个包含字符串'name'的属性,并且我打印了两次这个值。 – bomba6