2015-08-13 49 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