Eu tenho esse XML:
<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>
Quero extrair o 20.3817.
Tentando um pouco de sed, mas não conseguindo trabalhar.
Responder1
Não use expressões regulares para analisar XML. Use uma ferramenta compatível com XML, por exemplo xmllint
:
xmllint --xpath 'string(/results/testsuites/testcase/@time)' file.xml
Responder2
ComXMLStarlet:
$ xmlstarlet sel -t -v '//testcase/@time' -nl data.xml
20.3817
Responder3
Utilize lxprintf:
lxprintf -e "%s\n" total_time/@value test.xml
Responder4
Você estaria muito, muito melhor usando uma ferramenta compatível com XML
Se realmente for um caso simples de extrair o valor do time
atributo você pode usar sed
. Como você verá na maioria das respostas aqui, a melhor abordagem é usar uma ferramenta que entenda XML, mas para casos realmente simples vocêpode escapar impuneusando 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
Ougrep
echo "$xml" | grep -Po '(?<=time=")([0-9.]+)' # GNU
20.3817
MasEu ainda preferiria algo compatível com XML comoxmlstarlet
, que pode ser reconhecido time
como um atributo de <testcase>
.