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)!?~
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.