neu in diesem Forum. Ich versuche, ein seltsames Skript durchzuziehen, aber ich stecke seit einigen Tagen fest.
Ich habe zwei Textdateien.
Eingabe.txt Wiedergabeliste.txt
Input.txt Enthält eine Zahl, die alle 4 Stunden zufällig generiert wird.
083107
Playlist.txt enthält M3u-Links.
#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
Ich möchte also alle Vorkommen von 010707 suchen und ersetzen und sie durch die Nummer in der Datei Input.txt ersetzen, in diesem Fall 083107. Anschließend möchte ich eine Kopie der Datei Playlist.txt speichern und diese Nummer alle 4 Stunden erneut durch die in der Datei Input.txt ersetzen und so weiter.
Ich habe bereits ein sehr hässliches, aber funktionierendes Skript zusammengestellt, das grep und wget verwendet, um einige Dateien aus dem Internet herunterzuladen und diese Input.txt-Datei zu generieren.
Vielen Dank für Ihre Zeit.
BEARBEITEN
Jeden Tag lade ich eine M3uPlaylist-Datei „Playlist.m3u“ von einer Site herunter, nennen wir sie example.com.
Aber die Seite „example.com“ generiert alle 4 Stunden einen neuen Benutzer und ich muss ihn in der m3u-Datei manuell ersetzen, indem ich „Suchen (alte Benutzernummer)“ und „Ersetzen (neue Benutzernummer)“ verwende.
/live/**010707**/11/11594.ts to /live/**083107**/11/11594.ts
Das ist dabei herausgekommen:
Ich richte wget auf example.com aus und lade nur den Teil der Website herunter, der den Benutzer enthält.
wget -qO- 19X.71.5X.252 | grep -oP 'User:.*' > User.txt
Benutzer: 083107 Passwort: 11
Dann verwende ich grep, um eine „sauberere“ Datei zu generieren.
grep 'User' User.txt | grep -o '[0-9]*' > Numbers.txt
083107 11 2
Danach verwende ich den Befehl „head“, um eine Datei zu erstellen, die nur den Benutzernamen enthält.
head -1 Numbers.txt > input.txt
083107
Ich möchte erreichen, dass die Datei Playlist.txt (oder M3u) automatisch mit der neuen Benutzernummer aktualisiert wird, die example.com alle 4 Stunden generiert. Dazu verwende ich die Datei input.txt.
Dies ist der Teil des Quellcodes von example.com, der den Benutzer enthält.
<!--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>
Antwort1
Ich würde Folgendes tun:
# 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
Dieser Grep-Regex sollte nur die Zeichen finden, die keine Leerzeichen sind und nach „Benutzer:“ (also der Benutzer-ID) stehen. Auf diese Weise benötigen Sie die anderen temporären Dateien nicht.
Ich verwende auch die Wortbegrenzungsmarkierungen \<
und \>
für den Sed-Regex, damit die Benutzer-ID als ganzes Wort abgeglichen wird.
Antwort2
Aktualisierte Version
In Anbetracht der Tatsache, dass „010707“ der vorherige Inhalt der Datei „Input.txt“ ist, würde ich das Skript ein wenig ändern.
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
Führen Sie es mit aus <name-of-the-script>.sh 010707
.
Und wenn Sie anhängen statt überschreiben würden: head -1 Numbers.txt >> Input.txt
, wäre das Ganze noch einfacher.
while true
do
sed -i.backup "s/$(tail -2 Input.txt | head -1)/$(tail -1 Input.txt)/g" Playlist.txt
sleep 14400
done
Ursprüngliche Antwort
sed
ist was Sie brauchen:https://www.maketecheasier.com/was-ist-sed/.
while true
do
sed "s/010707/$(cat Input.txt)/g" Playlist.txt > NewPlaylist.txt
sleep 14400
done
sollte arbeiten.
Playlist.txt
Sie können auch „an Ort und Stelle“ mit Parametern bearbeiten -i
. Ich würde -i.backup
in diesem Fall jedoch vorschlagen, zu verwenden, um eine frühere Version der Datei als zu speichern Playlist.txt.backup
.
Sie können auch auf Input.txt
Dateiänderungen warten und dann aufrufen sed
.