我是这个论坛的新手。我正在尝试完成一个奇怪的脚本,但已经卡了好几天了。
我有两个文本文件。
输入.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 小时会生成一个新用户,我需要使用 find(旧用户号码)和 replace(新用户号码)手动在 m3u 文件中替换它。
/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
我想要实现的是,使用 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 正则表达式的\<
和\>
单词边界标记,以便您将 userid 作为整个单词进行匹配。
答案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
。