У меня есть этот 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>
.