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

長さが不明なリストから最後の2つを取得するには、次のようにテストします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

2番目の「保護された」URLを取得するには:

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

関連情報