Заметки по grep с регулярными выражениями: извлечение URL-адресов YouTube из непрерывного текста и последующее использование yt-dlp
Добрый вечер, я бездарь.
Если сделать дамп записей 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. Я все еще новичок, так что простите меня. Я даже не выяснил, почему это так, и думаю, что делаю все наоборот, усложняя себе жизнь, но это тот случай, когда весело вводить разные команды.
Конец.