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

时间:2015-08-13 12:35:07

标签: bash awk sed m3u

我有一个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工具中使用此功能。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

备用awk命令,

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

答案 1 :(得分: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)< / p>

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

答案 2 :(得分:0)

awk -F, 'f{print;f=0} ($2~/^NL:/) || /DE: Bundesliga/ || (tolower($0)~/sky sport/){print;f=1}' file