我有这个简单的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
答案 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