2015-08-13 1 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 в нем

Wanted результат

#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 

Я не могу заставить это работать ни в sed, awk, ни в любом другом инструменте bash, который может выполнить эту работу. Есть идеи?

+1

Думайте позитивно! Нет, серьезно, это сделает ваше ПО МНОГО ПОЛЬЗОВАТЕЛЕЙ проще писать и понять позже. Когда вы пишете требования, содержащие отрицательную логику ('Удалять несколько строк из файла M3U, который делает' ** не ** 'match pattern'), вы часто получаете программное обеспечение, написанное с отрицательной логикой и так трудно понять (и часто неправильно из-за непонимания [часто-двойных] отрицательных требований), так что просто возьмите секунду, чтобы увидеть, можете ли вы придумать способ написать требование в положительном ключе, например 'Выберите несколько строк из файла 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

Alternative 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