Ich habe dieses XML:
<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>
Ich möchte die 20,3817 extrahieren.
Ich versuche es mit etwas Sed, aber es funktioniert nicht.
Antwort1
Verwenden Sie keine regulären Ausdrücke zum Parsen von XML. Verwenden Sie ein XML-fähiges Tool, z . B xmllint
.:
xmllint --xpath 'string(/results/testsuites/testcase/@time)' file.xml
Antwort2
MitXMLStarlet:
$ xmlstarlet sel -t -v '//testcase/@time' -nl data.xml
20.3817
Antwort3
Verwenden Sie lxprintf:
lxprintf -e "%s\n" total_time/@value test.xml
Antwort4
Mit einem XML-fähigen Tool wären Sie weitaus besser bedient
Wenn es wirklich nur darum geht, den Wert des time
Attributs zu extrahieren, können Sie verwenden sed
. Wie Sie aus den meisten Antworten hier sehen werden, ist der bessere Ansatz, ein Tool zu verwenden, das XML versteht, aber für wirklich einfache Fälle müssen Siekönnte davonkommenmit 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
Odergrep
echo "$xml" | grep -Po '(?<=time=")([0-9.]+)' # GNU
20.3817
AberIch würde immer noch etwas XML-fähiges bevorzugen wiexmlstarlet
time
, das als Attribut von erkennen kann <testcase>
.