XML 파일에서 동일한 내용에 대해 선택된 일치 값을 추출합니다.

XML 파일에서 동일한 내용에 대해 선택된 일치 값을 추출합니다.

다음 xml 파일에 이 명령을 사용하고 있습니다.

xmlstarlet sel -t -v '//channel[protected = "True"]/playlist_url' -nl file.xml

그리고 결과;

host.net/aa/vodpr
host.net/aa/vodpr/con_tv_r.php

결과에서 행을 선택할 수 있나요? 마지막 행 또는 행 2만 예로 들어볼까요?

<?xml version="1.0" encoding="UTF-8" ?>
<items>   

<channel>
<title><![CDATA[*** variable text ***]]></title>
<playlist_url><![CDATA[http://host.net/aa/15_info/]]></playlist_url>
</channel>

<channel>       
<title><![CDATA[*** variable text ***]]></title>
<playlist_url><![CDATA[http://host.net/aa/16_info/]]></playlist_url>
</channel>

<channel>      
<title><![CDATA[*** variable text ***]]></title>
<playlist_url><![CDATA[http://host.net/aa/vodpr/]]></playlist_url>  
<protected>True</protected> 
</channel>

<channel>
<title><![CDATA[*** variable text ***]]></title>
<playlist_url><![CDATA[http://host.net/aa/vodpr/con_tv_r.php]]></playlist_url>
<protected>True</protected> 
</channel>

</items>

답변1

목록의 위치별로 노드에서 값을 선택하려면 playlist_url양의 정수를 사용하고 비교하십시오.channelposition()

$ xmlstarlet sel -t -v '//channel[position() = 4]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/con_tv_r.php

(이 경우 대신 사용할 수 있습니다 [4]) [position() = 4].

$ xmlstarlet sel -t -v '//channel[position() > 2]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/
http://host.net/aa/vodpr/con_tv_r.php

길이를 알 수 없는 목록에서 마지막 두 개를 얻으려면 다음을 사용하여 테스트하세요 last().

$ xmlstarlet sel -t -v '//channel[position() >= last() - 1]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/
http://host.net/aa/vodpr/con_tv_r.php

두 번째 "보호된" URL을 얻으려면:

$ xmlstarlet sel -t -v '//channel[protected = "True"][2]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/con_tv_r.php

관련 정보