私はこの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>
。