我有一个 XMLTV 文件。我需要获取特定频道的所有节目部分。示例代码片段:
<programme start="2023031305000 -0400" end="2023031305300 -0400" channel="Bleah.us"
<title>This is the Title</title>
<desc>This is the Description</desc>
</programme>
如果程序部分总是 4 行,则很简单:grep -A3 channel="Bleah.us"
但节目部分的长度可能会发生变化。有时它可能有附加子元素,如 <sub-title> 和/或 <category> 和/或 <icon>。
所以我的问题是。如何找到包含“channel="Bleah.us"”的行并打印该行以及所有行,直到找到“</programme>”(并打印该行)?可能有 1 个部分,也可能有 100 个部分,我不知道。
提前致谢!
答案1
grep
、sed
、awk
不是解析 的工具XML
。相反,请使用适当的XML
解析器:
和xidel
:
$ cat file.xml
<root>
<programme start="2023031305000 -0400" end="2023031305300 -0400" channel="Bleah.us"
<title>This is the Title</title>
<desc>This is the Description</desc>
</programme>
<programme start="2023031305000 -0400" end="2023031305300 -0400" channel="a"
<title>This is the Title</title>
<desc>This is the Description</desc>
</programme>
<programme start="2023031305000 -0400" end="2023031305300 -0400" channel="s"
<title>This is the Title</title>
<desc>This is the Description</desc>
</programme>
</root>
$ xidel --output-node-format=xml -e '//programme[@channel="Bleah.us"]' file.xml
和xmllint
:
$ xmllint --html --xpath '//programme[@channel="Bleah.us"]' file.xml 2>/dev/null
输出
<programme start="2023031305000 -0400" end="2023031305300 -0400" channel="Bleah.us" <title="">This is the Title
<desc>This is the Description</desc>
</programme>