Script para localizar e substituir

0

novo neste fórum. Estou tentando fazer um roteiro estranho, mas estou preso há alguns dias agora.

Eu tenho dois arquivos de texto.

Input.txt Playlist.txt

Input.txt Contém um número gerado aleatoriamente a cada 4 horas.

083107

Playlist.txt Contém links do 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

Então eu quero encontrar e substituir todas as ocorrências de 010707 e substituí-las pelo número dentro do arquivo Input.txt neste caso 083107, em seguida, salvar uma cópia do arquivo Playlist.txt, e a cada 4 horas substituir esse número novamente com o que está dentro do arquivo Input.txt e assim por diante.

Eu já montei um script muito feio mas funcional que usa o grep e o wget para baixar alguns arquivos da internet e gerar esse arquivo Input.txt.

Obrigado pelo seu tempo.

EDITAR

Todo dia eu baixo um arquivo M3uPlaylist "Playlist.m3u" de algum site, vamos chamá-lo example.com.

Mas, a página "example.com" gera um novo usuário a cada 4 horas e eu preciso substituí-lo manualmente no arquivo m3u usando find (número de usuário antigo) e replace (novo número de usuário).

/live/**010707**/11/11594.ts to /live/**083107**/11/11594.ts

Isso é o que eu criei:

Eu aponto para o exemplo.com e faço o download apenas da parte do site que contém o usuário.

wget -qO- 19X.71.5X.252 | grep -oP 'User:.*' > User.txt

Usuário: 083107 Senha: 11

Então eu uso o grep para gerar um arquivo "mais limpo".

grep 'User' User.txt | grep -o '[0-9]*' > Numbers.txt

083107 11 2

Depois disso, uso o comando "head" para criar um arquivo contendo apenas o nome do usuário.

head -1 Numbers.txt > input.txt

083107

O que eu quero realizar é atualizar automaticamente o arquivo Playlist.txt (ou M3u) com o novo número de usuário que o example.com está gerando a cada 4 horas. Usando o arquivo input.txt para isso.

Essa é a parte do código-fonte de example.com que contém o usuário.

<!--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>
    
por Orlando Muñoz Acevedo 07.06.2018 / 18:50

2 respostas

3

Eu faria isso:

# 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

Esse regex grep deve encontrar apenas os caracteres não espaciais após "User:" (isto é, o userid). Desta forma, você não precisa dos outros arquivos temporários.

Eu também uso os marcadores de limite de palavra \< e \> para o regex de modo que você combine o ID do usuário como uma palavra inteira.

    
por glenn jackman 07.06.2018 / 21:32
1

Versão atualizada

Considerando o fato de que "010707" é o conteúdo anterior do arquivo "Input.txt", eu mudaria um pouco o script.

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

Execute com <name-of-the-script>.sh 010707 .

E se você acrescentar em vez de sobrescrever: head -1 Numbers.txt >> Input.txt , tudo será ainda mais fácil.

while true
do
   sed -i.backup "s/$(tail -2 Input.txt | head -1)/$(tail -1 Input.txt)/g" Playlist.txt
   sleep 14400
done

Resposta original

sed é o que você precisa: link .

while true
do
   sed "s/010707/$(cat Input.txt)/g" Playlist.txt > NewPlaylist.txt
   sleep 14400
done

deve funcionar.

Você também pode editar Playlist.txt "no lugar" com parâmetro -i . Eu sugeriria usar -i.backup neste caso, para armazenar uma versão anterior do arquivo como Playlist.txt.backup .

Você também pode observar a alteração do arquivo Input.txt e, em seguida, chamar sed .

    
por kcpr 07.06.2018 / 19:04