Заметки по grep с регулярными выражениями: извлечение URL-адресов YouTube из непрерывного текста и последующее использование yt-dlp

6 min

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

Добрый вечер, я бездарь.

Если сделать дамп записей Mastodon, получится следующее.

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

Из этой непрерывной строки символов я хочу извлечь только URL-адреса YouTube.

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

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

На всякий случай, поскольку различать с 'www' или без него утомительно, я сопоставляю только часть после 'youtube.com', а затем заменяю.

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\

Я еще не смотрел внимательно, но по какой-то причине некоторые из них имеют обрезанный символ и содержат '\', поэтому я удаляю их с помощью 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

Поскольку это выглядит так, попробую посчитать символы в правильном URL.

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

Кажется, 32 символа.

Итак, я извлекаю только те, что имеют 32 символа.

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

И хотя это написано так, будто это сработало, при повторной проверке это не сработало. Когда я изменил 32 на 31, это сработало. Эй, почему? Кто-нибудь, объясните мне.

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

Поскольку они дублируются таким образом...

Я удаляю дублирующиеся строки с помощью uniq.

uniq mstvtmp.txt > newmstv.txt

На всякий случай, я ищу уникальные элементы и добавляю их.

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

Окей.

Итак, попробую скачать с помощью yt-dlp.
На этот раз я сохраню в формате 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

На этом этапе я заменяю на URL с 'www'.
Возможно, кто-то скажет: 'Почему бы просто не использовать '^' для начала строки поиска!', но лично мне нравится этот метод, потому что замена строки с середины кажется более воспроизводимой.

Также, поскольку присутствует '/', я использую '|' для разделения в sed. Хотя можно использовать и не '|'.

Затем, давайте переименуем его в формат .sh.

mv newmstv.txt ytdl.sh

vi ytdl.sh

и добавляем #!/bin/bash.

Давайте дадим права на выполнение.

chmod +x ./ytdl.sh

(Здесь я вдруг подумал, что нужно использовать './', и делаю это только сейчас. Хотя без этого ничего не изменится. Если не поставить, то ты не мужик.)

Затем, просто запустите, и все будет в порядке.

Кстати, должен быть способ извлечь строки URL чисто на первом этапе grep. Я все еще новичок, так что простите меня. Я даже не выяснил, почему это так, и думаю, что делаю все наоборот, усложняя себе жизнь, но это тот случай, когда весело вводить разные команды.

Конец.