Re : Notas de grep de expresiones regulares para extraer URL de YouTube de texto continuo y luego usar yt-dlp ~¿No se puede escapar el ? (signo de interrogación)? ¡El capítulo de!~

6 min

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

Hola, soy un inútil.

Es el título de un artículo que no sé si es un manga o un anime, propio de un inútil.

Este artículo anterior.

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

En ese momento, estaba escribiendo otros scripts de web scraping y estaba medio muerto de sueño alrededor de las 4 de la mañana, así que tanto los comandos como el texto eran un desastre.

Lo resumiré de nuevo.

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

Lo anterior puede manejar expresiones regulares de Perl.
También es posible con lo siguiente

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

Además, usar expresiones regulares de Perl puede ser bastante pesado, por lo que si hay muchos caracteres o si se usa dentro de un script, puede ser mejor usar un comando como el siguiente, si es posible.

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

Por cierto, ¿escapar el signo de interrogación solo es posible con expresiones regulares de Perl?

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

Lo anterior no funciona.

Si esto se hace sin una barra invertida, coincidirá con "un carácter que aparece 0 o 1 vez antes del carácter".

Así que, investigando, parece que si se pone entre corchetes `[?]`, se puede tratar como una cadena de texto.

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

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

¡Con esto, todo bien!

¡Eliminemos las líneas que contienen "/" y "\" y "<" innecesarios!

Al principio, sospeché de mi comando grep, pero no era eso.

Por alguna razón, el archivo outbox.json exportado de las publicaciones de Mastodon produce la siguiente salida:

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

Si te fijas bien, ¡el último carácter (el undécimo) de la cadena W7G-QtbTWg ha desaparecido y se ha convertido en una barra invertida! Por supuesto, así no se puede generar una URL de guardado de URL correctamente.

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

Afortunadamente, las URL que se muestran correctamente también se han extraído con grep de forma duplicada, así que solo tengo que eliminar las innecesarias.
Además, algunas tienen un '<' al final, ¿qué es esto...?

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

Salida de líneas duplicadas y no duplicadas con uniq

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

¡¡¡Hecho!!!

Finalmente, convertir a formato yt-dlp con 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

¡Eso es todo! Buen trabajo.

El resto es añadir `#!/bin/bash`, dar permisos de ejecución y ejecutarlo. ¡Listo! No creo que nadie lo copie y pegue tal cual, pero no olvides cambiar el directorio de destino y otras configuraciones.

Finalmente, sobre el comando wc...

Pregunta anterior

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

Parece tener 32 dígitos.

Así que extraigo solo los de 32 dígitos.

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

Y, aunque está escrito como si hubiera tenido éxito, no funcionó al volver a verificarlo. Funcionó cuando cambié 32 a 31. Eh, ¿por qué? Que alguien me lo explique.

Al parecer, cuando el comando `wc` cuenta caracteres en una cadena, también incluye el carácter de nueva línea, por lo que incluso un archivo vacío creado con `touch` muestra 1. Así que, al usarlo, hay que restar el número de líneas.

Hasta la próxima.

Saludos cordiales.

Related Posts