2015-08-13 87 views
1

我有一个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工具中使用此工作。有任何想法吗?

+1

积极思考!不,严重的是,它会让你的软件更容易编写和稍后理解。当你编写包含负逻辑的需求时('从一个M3U文件中删除多个不符合匹配模式的文件'),你通常会得到用负逻辑编写的软件,这些软件很难理解(并且通常是错误的由于误解了[通常是双重]负面需求),所以请花点时间看看你是否能够以积极的方式写出需求的方式,例如'从M3U文件中选择符合模式的多行。 –

回答

1

可以使用下面的命令:

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/I,I进行大小写不敏感的匹配。

2

替代awk命令,

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

如果'getline'失败,将会产生负面影响,您需要为此进行测试,并且它具有所有常见的'getline'注意事项。见http://awk.info/?tip/getline(然后不要使用它,因为这不是一个好的getline应用程序)。 –

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