从与模式不匹配的 M3U 文件中删除多行

Posted

技术标签:

【中文标题】从与模式不匹配的 M3U 文件中删除多行【英文标题】:Delete multiple lines from an M3U file that does not match pattern 【发布时间】:2015-11-06 10:22:20 【问题描述】:

我有一个 m3u 文件,我想从中删除一些行。我知道我想从 m3u 文件中保留哪些频道。我想要保留的频道列表比我不想要的频道列表短。

输入文件

#EXTM3U
#EXTINF:-1,ex-Yu: TV 1
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3168.ts
#EXTINF:-1,ex-Yu: TK Tuzla
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3164.ts
#EXTINF:-1,ex-Yu: SOS
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3191.ts
#EXTINF:-1,NL: NPO 1
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3190.ts
#EXTINF:-1,NL: NPO 2
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3167.ts
#EXTINF:-1,GB: Discovery
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3166.ts
#EXTINF:-1,GB: NGC
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3201.ts
#EXTINF:-1,NL: NPO 3
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3200.ts
#EXTINF:-1,IT: SKY Sport
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3198.ts
#EXTINF:-1,ex-Yu: Pink Film
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3199.ts
#EXTINF:-1,GB: Sky Sport
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3172.ts
#EXTINF:-1,ex-Yu: N1 Bosna
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3197.ts
#EXTINF:-1,DE: Bundesliga
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3195.ts
#EXTINF:-1,ex-Yu: MTV
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3170.ts
#EXTINF:-1,ex-Yu: Mini TV
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3177.ts
#EXTINF:-1,ex-Yu: M1 Film
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3179.ts
#EXTINF:-1,ex-Yu: Lov I Ribolov
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3196.ts
#EXTINF:-1,ex-Yu: Klasik TV
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3194.ts

以上是所有频道的简短列表。我知道我想保留以下频道:

所有以NL: 开头的频道(区分大小写) 所有带有sky sport 的频道(不区分大小写) 包含DE: Bundesliga 的所有频道

想要的结果

#EXTM3U
#EXTINF:-1,NL: NPO 1
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3190.ts
#EXTINF:-1,NL: NPO 2
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3167.ts
#EXTINF:-1,NL: NPO 3
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3200.ts
#EXTINF:-1,IT: SKY Sport
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3198.ts
#EXTINF:-1,GB: Sky Sport
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3172.ts
#EXTINF:-1,DE: Bundesliga
http://channel.domain.com:9603/live/YHJKUYII/02490j4/3195.ts

我无法在 sedawk 或任何其他可以完成这项工作的 bash 工具中使用它。有什么想法吗?

【问题讨论】:

积极思考!不,说真的,它会让你的软件更容易编写和以后理解。当您编写包含负面逻辑的需求时(Delete multiple lines from an M3U file that does not match pattern),您通常最终会得到用负面逻辑编写的软件并且很难理解(并且由于误解 [经常-double] 负面要求)所以请花一点时间看看您是否可以想出一种以正面方式编写要求的方法,例如Select multiple lines from an M3U file that match pattern. 【参考方案1】:

替代awk 命令,

 awk '/NL:|DE: Bundesliga/ || tolower($0) ~ /sky sport/ print; getline; print'

【讨论】:

如果getline 失败,这将产生负面影响,您需要对此进行测试,并且它具有所有常见的getline 警告。请参阅awk.info/?tip/getline(然后无论如何都不要使用它,因为这不是 getline 的好应用程序)。【参考方案2】:

您可以使用以下命令:

sed -n -r -e '/EXTM3U/p' -e '/NL:|DE: Bundesliga/,+1p' -e '/sky sport/I,+1p'

对于每个匹配的模式,它会打印当前行和下一行。

-n 禁止自动打印模式,-r 使用扩展的正则表达式,-e 允许在同一命令中添加多个 sed 脚本。

/EXTM3U/p 是最简单的:它匹配包含EXTM3U 的行并打印它们(p

对于'/NL:|DE: Bundesliga/,+1p',它匹配包含NL:DE: Bundesliga 的行,并打印它(p)以及以下行(+1

对于/sky sport/II 进行不区分大小写的匹配。

【讨论】:

【参考方案3】:
awk -F, 'fprint;f=0 ($2~/^NL:/) || /DE: Bundesliga/ || (tolower($0)~/sky sport/)print;f=1' file

【讨论】:

以上是关于从与模式不匹配的 M3U 文件中删除多行的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配模式并从多行字符串中删除整行

Python正则表达式,多行匹配模式..为啥这不起作用?

从多个文件中删除多行文本

模式匹配并删除除最后一次出现的所有行

awk 模式可以匹配多行吗?

如何从pyspark中的文件中匹配/提取多行模式