![XML에서 값 추출](https://rvso.com/image/83672/XML%EC%97%90%EC%84%9C%20%EA%B0%92%20%EC%B6%94%EC%B6%9C.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
와 함께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>
.