このフォーラムは初めてです。奇妙なスクリプトを実行しようとしているのですが、ここ数日行き詰まっています。
テキストファイルが 2 つあります。
入力.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 ファイルを生成する、非常に見苦しいが動作するスクリプトを作成しました。
お時間をいただきありがとうございます。
編集
毎日、あるサイト (example.com と呼ぶことにします) から M3uPlaylist ファイル「Playlist.m3u」をダウンロードします。
しかし、ページ「example.com」は 4 時間ごとに新しいユーザーを生成するため、find (古いユーザー番号) と replace (新しいユーザー番号) を使用して、m3u ファイル内で手動で置き換える必要があります。
/live/**010707**/11/11594.ts to /live/**083107**/11/11594.ts
私が思いついたのはこれです:
wget を example.com にポイントし、ユーザーが含まれる Web サイトの部分のみをダウンロードします。
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
私が実現したいのは、example.com が 4 時間ごとに生成する新しいユーザー番号で Playlist.txt (または M3u) ファイルを自動的に更新することです。そのために 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:」(つまり、ユーザー ID) の後のスペース以外の文字だけを検索します。この方法では、他の一時ファイルは必要ありません。
また、 sed 正規表現に単語境界マーカー\<
と\>
単語境界マーカーを使用して、ユーザー ID を単語全体として一致させます。
答え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
。