![XMLから値を抽出する](https://rvso.com/image/83672/XML%E3%81%8B%E3%82%89%E5%80%A4%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B.png)
次のような 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
$ 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>
。