小编Sky*_*wer的帖子

是否有Linux命令行实用程序从XML文件中删除部分(不确定这是否是正确的术语)?

我正在尝试对包含电视节目表信息的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)

这正是我所寻找的,所以我认为问题已经解决了.感谢所有回复的人.

xml linux bash television

3
推荐指数
1
解决办法
199
查看次数

标签 统计

bash ×1

linux ×1

television ×1

xml ×1