- Вопрос или проблема
- Как это работает?
- Получите имена входного и выходного файлов из аргументов скрипта
- Создайте пустой выходной файл
- Переменная для хранения номера канала
- Итерация по каждой строке в входном файле
- Если строка начинается с “#EXTINF”, это означает, что это строка, описывающая канал
- Добавьте строку в выходной файл
- Ответ или решение
- Контекст проблемы
- Проблемы существующего сценария
- Исправленный скрипт
- Объяснение работы сценария
- Заключение
Вопрос или проблема
Мне нужно добавить номера каналов в файл плейлиста M3U. Эти номера каналов передаются в скрипт с помощью интерактивного запроса. Все это работает на 90%.
Идея заключается в том, что скрипт будет проходить по строкам файла M3U и добавлять их в определенное место. К сожалению, он обрабатывает все строки, но добавляет каждый номер канала к каждой строке вместо одного номера канала на строку. Я немного запутался, дойдя до этого этапа, есть идеи?
#!/bin/bash
LISTA="test.m3u"
LINEA_INFO=0
IFS=$'\n'
(
while read LINEA; do
INFO=$(echo "$LINEA" | grep '^#EXTINF:')
if [ "$LINEA_INFO" -eq 0 ] && [ -n "$INFO" ]; then
LINEA_INFO=1
CHANNELNAME=$(echo "$LINEA" | sed 's|.*,||')
echo выберите номер канала для $CHANNELNAME
read varnumber < /dev/tty;
echo вы выбрали $varnumber для $CHANNELNAME
fi
if [ "$LINEA_INFO" -eq 1 ] && [ -z "$INFO" ]; then
LINEA_INFO=0
echo "$LINEA" | sed -i -e's/\#EXTINF:-1\>/& tvg-chno="'$varnumber'"https://unix.stackexchange.com/" $LISTA
fi
done < "$LISTA"
)
echo "Готово!"
Если я правильно вас понял, скрипт шелл должен проходить через каждую строку входного файла m3u и заполнять номера каналов, которые запрашиваются интерактивно для каждой строки. Итак, я предлагаю:
#!/bin/bash
InputList="$1"
OutputList="$2"
> "$OutputList"
while IFS= read -r Line; do
if [[ "$Line" =~ ^#EXTINF: ]]; then
echo "выберите номер канала для $Line"
read varnumber < /dev/tty
echo "вы выбрали $varnumber для $Line"
Line="${Line%% *} tvg-chno=\"${varnumber}\" ${Line#* }"
fi
echo "$Line" >> "$OutputList"
done < "$InputList"
Использование:
$ ./m3u_channels.sh test-1.m3u test-1-ch.m3u
Он создает файл test-1-ch.m3u
с вставленными номерами каналов.
Как это работает?
Программа довольно проста. Она читает файл, заданный $InputList
, построчно с помощью цикла while
. read
останавливается на каждой строке (по умолчанию, как используется здесь). Если строка начинается с #EXTINF:
, пользователю предлагается ввести данные, которые сохраняются в переменной $varnumber
(скопировано из вашей программы). Затем переменная $Line
формируется как:
${Line%% *}
: Начало строки$Line
до первого пробела.- Пробел, буквально.
tvg-chno=\"${varnumber}\"
строка с номером канала.- Пробел, буквально.
${Line#* }
: Строка$Line
с первого пробела.
Затем содержимое переменной $Line
добавляется в выходной файл, будь оно модифицировано или нет.
Интересно, работает ли этот скрипт?? Я молод и не много понимаю. Но у меня есть список IPTV, и у меня есть скрипт, но ничего не происходит. Вы можете мне помочь??
#!/bin/bash
Получите имена входного и выходного файлов из аргументов скрипта
input_file=”Freetv.m3u”
output_file=”Freetv.m3u”
Создайте пустой выходной файл
touch $output_file
Переменная для хранения номера канала
channel_number=1
Итерация по каждой строке в входном файле
while read line; do
Если строка начинается с “#EXTINF”, это означает, что это строка, описывающая канал
if [[ $line == “#EXTINF”* ]]; then
# Добавьте номер канала к параметру tvg-chno
line=$(echo $line | sed “s/tvg-name/tvg-chno=”$channel_number” tvg-name/”)
# Увеличьте номер канала на 1
channel_number=$((channel_number+1))
fi
Добавьте строку в выходной файл
echo $line >> $output_file
done < $input_file
Ответ или решение
Добавление номеров каналов в M3U плейлист – задача, с которой может столкнуться любой пользователь IPTV, стремящийся улучшить и персонализировать свой опыт. Рассмотрим детально, как можно корректно добавить номера каналов в файл M3U с использованием Bash-скрипта.
Контекст проблемы
Вы исходите из требования, что необходимо пройти по M3U файлу, строчка за строчкой, и добавить номер канала для каждой соответствующей строки #EXTINF
. Ожидается, что номера каналов вводятся интерактивно через терминал. Однако в данном случае вы сталкиваетесь с проблемой, когда каждый номер добавляется ко всем строкам, а не только к соответствующей.
Проблемы существующего сценария
-
Ввод номер согласно файлу: Из текущего описания ясно, что используется переменная
$varnumber
, которая добавляется неправильным образом. Вы используетеsed
для вставки нового значения, но текущая строка уже модифицирована перед записью. -
Управление потоком данных: Используемая логика не учитывает корректное переключение между строками
#EXTINF
и ссылками на каналы.
Исправленный скрипт
#!/bin/bash
# Имена входного и выходного файла
input_file="Freetv.m3u"
output_file="Freetv-channels.m3u"
# Создать или очистить выходной файл
> "$output_file"
# Переменная для хранения номера канала
channel_number=1
# Чтение файла построчно
while IFS= read -r line; do
if [[ "$line" =~ ^#EXTINF: ]]; then
echo "Введите номер канала для ${line#*,}:"
read varnumber < /dev/tty
echo "Вы выбрали $varnumber для канала ${line#*,}"
line="${line%%,*}, tvg-chno=\"$varnumber\",${line#*,}"
fi
echo "$line" >> "$output_file"
done < "$input_file"
echo "Обработка завершена!"
Объяснение работы сценария
-
Переменные: Скрипт получает входной и выходной файл. Выходной файл создаётся заново и очищается, что предотвращает накопление информации при повторных запусках.
-
Перебор построчно: Каждая строка тестируется с помощью регулярного выражения для нахождения строк – метаданных
#EXTINF
. -
Интерактивный ввод: Для каждой строки
#EXTINF
пользователь вводит номер канала, который добавляется к метаданным канала. -
Обновление строки: Строка модифицируется с добавлением номера канала в позиции, где он должен быть.
-
Запись: Изменённые и неизменённые строки записываются в новый файл.
Заключение
Итак, указанный скрипт решает поставленную задачу. Он включает все необходимые шаги для корректного переработки файла M3U плейлиста, чтобы результат соответствовал вашим ожиданиям. Данный подход оптимизирует рабочий процесс и может быть адаптирован под разнообразные сценарии работы с IPTV.