Sky*_*wer 3 xml linux bash television
我正在尝试对包含电视节目表信息的XMLTV格式文件进行一些操作.在文件中是如下所示的部分:
<programme start="20141215220000 -0500" stop="20141216060000 -0500" channel="someid.someaddress.com">
<title lang="en">Local Programming</title>
<length units="hours">1</length>
<episode-num system="common">S00E00</episode-num>
<episode-num system="dd_progid">SH00019112.0000</episode-num>
<previously-shown />
</programme>
Run Code Online (Sandbox Code Playgroud)
如您所见,第二行包含:
<title lang="en">Local Programming</title>
Run Code Online (Sandbox Code Playgroud)
我想要找到的是某种在Linux中运行的命令行实用程序,它可以查找该特定行,如果存在,则删除程序标记之间的所有内容.我不是很熟悉XML文件,所以我不知道如果有一个像这样的数据块的具体名称,但我只是想删除整款每当标题是"本地编程".
如果我只能在标题是"本地编程"并且第一行中的通道值是某个特定值时才删除块,那么它实际上会更好地用于我的目的,因为我只需要为特定通道删除这些,但是删除任何通道上的所有"本地编程"块都不会有任何损害,并且查找两个值可能会使这个问题变得更加困难.它必须是命令行实用程序,因为它将从短shell脚本调用.
基本上我只是想找出最适合这份工作的工具.我不是一个程序员(除非你计算一个几行的bash shell脚本,它只是按顺序运行几个东西,作为编程)所以我想尽可能坚持现有的命令行工具,但我是用apt-get来拉动新东西并不是不利的.有什么建议?
编辑:有效的是Charles Duffy建议的xmlstarlet工具,但前提是我没有尝试使用--var选项而是直接指定值.例如,这从文件xmltv.xml中删除了标题为"Local Programming"的所有块:
xmlstarlet ed --delete "//programme[title='Local Programming']" <xmltv.xml >newfile.xml
Run Code Online (Sandbox Code Playgroud)
如果我只想在标题是"本地编程"并且第一行中的通道值是某个特定值时删除该块,那么它似乎有效:
xmlstarlet ed --delete "//programme[title='Local Programming'][@channel='someid.someaddress.com']" <xmltv.xml >newfile.xml
Run Code Online (Sandbox Code Playgroud)
这正是我所寻找的,所以我认为问题已经解决了.感谢所有回复的人.
删除任何同时具有英语标题Local Programming和频道的节目someid.someaddress.com:
xmlstarlet ed \
--var chan "'someid.someaddress.com'" \
--var name "'Local Programming'" \
--delete '//programme[title[@lang="en"]=$name][@channel=$chan]' \
<in.xml >out.xml && mv out.xml in.xml
Run Code Online (Sandbox Code Playgroud)
如果你的目标较旧版本XMLStarlet,你可能需要自己做的换人-用"Local Programming"代替$name和"someid.someaddress.com"代替的$chan-但上述已知对1.5.0版本一起使用.
这需要工具XMLStarlet,它应该可以在您的分发供应商的存储库中安装.
请注意,您没有显示文档的名称空间声明 - 如果xmlns='...'已在父项中指定,则可能需要调整某些调整.
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |