次の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
正の整数を使用して比較します。channel
position()
$ 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