Новичок на этом форуме. Я пытаюсь реализовать странный скрипт, но застрял на несколько дней.
У меня есть два текстовых файла.
Входной.txt Список воспроизведения.txt
Input.txt Содержит число, которое генерируется случайным образом каждые 4 часа.
083107
Playlist.txt Содержит ссылки M3u.
#EXTINF:-1 tvg-id="" tvg-name="CHAN 1" tvg-logo="" group-title="FTA",CHAN 1
http://xxxxx.com:25461/live/**010707**/11/11594.ts#
EXTINF:-1 tvg-id="" tvg-name="CHAN " tvg-logo="" group-title="FTA",CHAN 2
http://xxxxx.com:25461/live/**010707**/11/11594.ts
Поэтому я хочу найти и заменить все вхождения 010707 и заменить их на номер внутри файла Input.txt, в данном случае 083107, затем сохранить копию файла Playlist.txt и каждые 4 часа снова заменять этот номер на номер внутри файла Input.txt и так далее.
Я уже составил очень уродливый, но работающий скрипт, который использует grep и wget для загрузки некоторых файлов из интернета и генерации файла Input.txt.
Спасибо за ваше время.
РЕДАКТИРОВАТЬ
Каждый день я скачиваю файл M3uPlaylist «Playlist.m3u» с какого-то сайта, назовем его example.com.
Но страница «example.com» генерирует нового пользователя каждые 4 часа, и мне нужно вручную заменить его в файле m3u, используя find (старый номер пользователя) и replace (новый номер пользователя).
/live/**010707**/11/11594.ts to /live/**083107**/11/11594.ts
Вот что у меня получилось:
Я указываю wget на example.com и загружаю только ту часть сайта, которая содержит пользователя.
wget -qO- 19X.71.5X.252 | grep -oP 'User:.*' > User.txt
Пользователь: 083107 Пароль: 11
Затем я использую grep для создания «более чистого» файла.
grep 'User' User.txt | grep -o '[0-9]*' > Numbers.txt
083107 11 2
После этого я использую команду «head», чтобы создать файл, содержащий только имя пользователя.
head -1 Numbers.txt > input.txt
083107
Я хочу автоматически обновить файл Playlist.txt (или M3u) новым номером пользователя, который example.com генерирует каждые 4 часа. Для этого используется файл input.txt.
Это часть исходного кода example.com, содержащая пользователя.
<!--You need to visit this site every 4 hours in order to get a new user-->
<div id="domainSearch" class="domain-search--section bg--overlay-color bg--overlay-opacity-95 pd--80-0 text-center" data-bg-img="img/domain-search-img/bg.jpg">
<div class="container">
<!-- Domain Search Title Start -->
<div class="domain-search--title">
<h2 class="h3">Whatsapp: +52 </h3>
<h2 class="h2">User: 083107 Password: 11</h2>
решение1
Я бы сделал так:
# extract the userid from the current playlist
prev_user=$(grep -Po '(?<=live/).+(?=/11/11594.ts)' Playlist.txt | head -1)
# find the current userid
current_user=$(wget -qO- 19X.71.5X.252 | grep -oP 'User:\s*\K\S+')
# update the playlist
sed_body=$(printf 's/\<%s\>/%s/g' "$prev_user" "$current_user")
sed -i "$sed_body" Playlist.txt
Это регулярное выражение grep должно просто найти непробельные символы после "User:" (т.е. идентификатор пользователя). Таким образом, вам не понадобятся другие временные файлы.
Я также использую маркеры границ слов \<
и \>
для регулярного выражения sed, чтобы сопоставить идентификатор пользователя как целое слово.
решение2
Обновленная версия
Учитывая тот факт, что «010707» — это предыдущее содержимое файла «Input.txt», я бы немного изменил скрипт.
PREVIOUS_INPUT=$1
while true
do
NEW_INPUT=$(cat Input.txt)
sed -i.backup "s/$PREVIOUS_INPUT/$NEW_INPUT/g" Playlist.txt
PREVIOUS_INPUT=$NEW_INPUT
sleep 14400
done
Запустите его с помощью <name-of-the-script>.sh 010707
.
А если бы Вы дописывали, а не перезаписывали:, head -1 Numbers.txt >> Input.txt
все было бы еще проще.
while true
do
sed -i.backup "s/$(tail -2 Input.txt | head -1)/$(tail -1 Input.txt)/g" Playlist.txt
sleep 14400
done
Оригинальный ответ
sed
это то, что Вам нужно:https://www.maketecheasier.com/what-is-sed/.
while true
do
sed "s/010707/$(cat Input.txt)/g" Playlist.txt > NewPlaylist.txt
sleep 14400
done
должно сработать.
Вы также можете редактировать Playlist.txt
"на месте" с
-i
параметром. Я бы предложил использовать -i.backup
в этом случае, чтобы сохранить предыдущую версию файла как Playlist.txt.backup
.
Вы также можете следить за Input.txt
изменением файла, а затем вызывать sed
.