wget を example.com にポイントし、ユーザーが含まれる Web サイトの部分のみをダウンロードします。

wget を example.com にポイントし、ユーザーが含まれる Web サイトの部分のみをダウンロードします。

このフォーラムは初めてです。奇妙なスクリプトを実行しようとしているのですが、ここ数日行き詰まっています。

テキストファイルが 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: &nbsp;&nbsp; +52 </h3>
                    <h2 class="h2">User: 083107      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  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.backupPlaylist.txt.backup

Input.txtファイルの変更を監視してから を呼び出すこともできますsed

関連情報