이 포럼에 새로운 사람입니다. 이상한 대본을 작성하려고 하는데 며칠 동안 막혔습니다.
두 개의 텍스트 파일이 있습니다.
입력.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 파일에서 수동으로 교체해야 합니다.
/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:"(예: 사용자 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
.