Linux - 查找字符串然后找到节的末尾

Linux - 查找字符串然后找到节的末尾

我有一个 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

grepsedawk不是解析 的工具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>

相关内容