Notas de grep con expresiones regulares para extraer URLs de YouTube de texto continuo y luego descargarlas con yt-dlp

6 min

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

Buenas noches, soy un inútil.

Cuando se descargan las publicaciones de Mastodon, se ven así.

/\u003e\u003ca href=\"https://youtube.com/watch?v=jL4NZ913v8E\u0026amp;feature=share\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"ellipsis\"

Y quiero extraer solo las URLs de YouTube de esta cadena de texto continua.

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

grep -oP ‘youtube.com\/shorts\/…………’ outbox.json > mstv2.txt

Por ahora, es molesto distinguir entre con y sin "www", así que solo haré coincidir desde "youtube.com" en adelante y lo reemplazaré más tarde.

youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p\
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p\
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg\
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg\

Todavía no lo he mirado de cerca, pero por alguna razón, algunas entradas tienen un carácter cortado y una barra invertida `\` insertada, así que lo eliminaré con sed -i.

sed -i ‘s/\\//g’ mstv.txt

youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg

Como queda así, intentaré contar los caracteres de la cadena URL correcta.

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

Parece que tiene 32 caracteres.

Así que extraeré solo los de 32 caracteres.

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

Está escrito como si hubiera tenido éxito, pero cuando lo volví a verificar, no funcionó. Funcionó cuando cambié 32 a 31. ¿Por qué? ¿Alguien puede decírmelo?

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

youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8pc

Como se duplica así...

Eliminaré las líneas duplicadas con uniq.

uniq mstvtmp.txt > newmstv.txt

Por si acaso, buscaré los que no estén duplicados y los añadiré.

uniq -u mstvtmp.txt >> newmstv.txt

youtube.com/watch?v=jL4NZ913v8E
youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=DRVp_cmW3Nw

¡Está bien!

Así que intentaré descargarlos con yt-dlp.
Esta vez, los guardaré en formato mp4.

sed -i ‘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’ newmstv.txt

En el punto anterior, estoy reemplazando con URLs que tienen "www".
Algunos podrían decir: "¡Por qué no usar simplemente ^ para el inicio de la cadena de búsqueda!", pero personalmente, prefiero este método porque reemplazar desde una cadena en el medio parece tener una mayor reproducibilidad.

Además, como hay una `/`, estoy usando `|` para delimitar en sed. Aunque no tiene por qué ser `|`.

Y luego, vamos a nombrarlo en formato .sh.

mv newmstv.txt ytdl.sh

vi ytdl.sh

Y añadir #!/bin/bash.

Vamos a darle permisos de ejecución.

chmod +x ./ytdl.sh

(Aquí, de repente pensé "¡Debo hacerlo con ./!" y lo hice ahora. No cambia nada sin él, pero no incluirlo me convierte en un fracaso como hombre.)

Después de eso, ejecutarlo y listo.

Por cierto, debe haber una forma de extraer la cadena URL limpiamente en la primera etapa de grep. Todavía soy muy aficionado, así que por favor, perdónenme. Ni siquiera he investigado por qué, así que creo que estoy haciendo las cosas de una manera complicada, pero esta es una sesión sobre lo divertido que es escribir varios comandos.

Fin.