Re: Notas sobre grep de expressão regular para extrair URLs do YouTube de texto contínuo e usar yt-dlp ~Não é possível escapar de '?' (ponto de interrogação)!?~

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

Olá, sou um inútil.

É o título de um artigo que não sei se é um mangá ou um anime, típico de um inútil.

Este artigo anterior.

https://soulminingrig.com/blog/連続したテキストからyoutube-url抜くだけでの正規表現grep/

Naquela época, eu estava escrevendo outros scripts de web scraping e estava quase morrendo de sono, escrevendo por volta das 4 da manhã, então os comandos e o texto estavam uma bagunça.

Vou resumir novamente.

grep -oP ‘youtube\.com\/watch\?v\=…’ outbox.json > pyaa.txt

O acima pode lidar com expressões regulares Perl.
Também é possível com o seguinte:

grep -oP ‘youtube\.com\/watch\?v\=.{11}’ outbox.json > pyaa.txt

Além disso, usar expressões regulares Perl pode ser muito pesado, então se você tiver muitos caracteres ou for usar em um script, pode ser melhor usar um comando como o seguinte, se possível.

grep -o ‘youtube\.com/watch?v=…’ outbox.json > pyaa.txt

Aliás, escapar do ponto de interrogação só é possível com expressões regulares Perl?

grep -o ‘youtube\.com/watch\?v=…’ outbox.json > owo.txt

O acima não funciona.

Sem a barra invertida, ele "corresponderá a um caractere que aparece 0 ou 1 vez antes do caractere anterior".

Então, pesquisando, descobri que se você colocar [?] entre colchetes, ele pode ser tratado como uma string.

https://stackoverflow.com/questions/10602433/how-to-escape-a-question-mark-in-r

grep -o ‘youtube\.com/watch[?]v=…’ outbox.json > pyaa.txt

Com isso, tudo certo!

Vamos remover as linhas que contêm "/" e "\" e "<" desnecessários!

No início, eu estava duvidando do meu comando grep, mas estava errado.

Por alguma razão, o outbox.json exportado das postagens do Mastodon tem a seguinte saída:

class=\"ellipsis\"\u003eyoutube.com/watch?v=DRVp_cmW3N\u003c/span\u003e\u003cspan class=\"invisible\"\u003es\u0026amp;feature=share7\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\",\"contentMap\":{\"ja\":\"\u003cp\u003e\u003ca

Olhando de perto, o último caractere (11º caractere) da string W7G-QtbTWg desapareceu e se tornou uma barra invertida! Claro, assim não pode ser emitido como um URL de salvamento de URL normal.

youtube.com/watch?v=DRVp_cmW3Nw
youtube.com/watch?v=DRVp_cmW3N\

Felizmente, os URLs exibidos corretamente também são duplicados pelo grep, então basta remover os desnecessários.
Além disso, alguns têm '<' no final, o que é isso...?

sed ‘/\\$\|\/$\|<$/d’ pyaa.txt > nyan.txt

Saída de linhas duplicadas e não duplicadas separadamente com uniq

uniq nyan.txt > nyanya.txt
uniq -u nyan.txt >> nyanya.txt

Consegui!!!

Finalmente, converter para o formato yt-dlp com sed

sed ‘s|youtube|yt-dlp -o “/media/ncp/yt/n/%(title)s” -f “bv[ext=mp4]+ba[ext=m4a]” –merge-output-format mp4 https://www.youtube|g’ nyanya.txt > nya.sh

É isso! Bom trabalho.

O resto é adicionar #!/bin/bash, dar permissão de execução e executar. Tudo certo. Não acho que alguém vá copiar e colar, mas não se esqueça de mudar o diretório de destino e outras coisas.

Finalmente, sobre o comando wc...

Dúvida anterior

echo “youtube.com/watch?v=g5HQFrSk4OA” | wc -c
32

Parece ter 32 caracteres.

Então, extrair apenas os de 32 caracteres.

grep -oP ‘^.{32}$’ mstv.txt > mstvtmp.txt

Está escrito como se tivesse tido sucesso, mas quando reexaminei, não funcionou. Funcionou quando mudei 32 para 31. Por que isso? Alguém pode me dizer?

Aparentemente, quando o comando wc conta caracteres, ele também inclui a contagem de linhas, e até mesmo um arquivo vazio criado com touch exibe 1. Portanto, ao usá-lo, é preciso subtrair a contagem de linhas.

Até a próxima.

Obrigado pela sua atenção.

Related Posts