我有这个 XML:
<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>
我想提取 20.3817。
尝试一些 sed 但无法开始工作。
答案1
不要使用正则表达式来解析 XML。使用 XML 感知工具,例如xmllint
:
xmllint --xpath 'string(/results/testsuites/testcase/@time)' file.xml
答案2
和XML小星:
$ xmlstarlet sel -t -v '//testcase/@time' -nl data.xml
20.3817
答案3
使用lxprintf:
lxprintf -e "%s\n" total_time/@value test.xml
答案4
使用支持 XML 的工具会好得多
如果这确实是提取属性值的简单情况,time
您可以使用sed
.正如您将从这里的大多数答案中看到的,更好的方法实际上是使用理解 XML 的工具,但对于非常简单的情况,您可能会逃脱使用sed
。
xml='<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>'
echo "$xml" | sed -nr 's/.* time="([0-9.]+).*/\1/p' # GNU
28.3817
echo "$xml" | sed -n 's/.* time="\([0-9.]*\).*/\1/p' # Non-GNU
28.3817
或者grep
echo "$xml" | grep -Po '(?<=time=")([0-9.]+)' # GNU
20.3817
但我仍然更喜欢 XML 感知的东西,比如xmlstarlet
,它可以识别time
为 的属性<testcase>
。