Re : Заметки о регулярных выражениях grep для извлечения URL-адресов YouTube из непрерывного текста и последующего использования yt-dlp ~Невозможно экранировать ? (вопросительный знак)!?~
Привет, я бездарь.
Это название статьи, которое, как и следовало ожидать от бездаря, непонятно, из какого оно аниме или манги.
Предыдущая статья.
https://soulminingrig.com/blog/連続したテキストからyoutube-url抜くだけでの正規表現grep/
В то время я писал другие скрипты для веб-скрейпинга, и, умирая от сонливости, писал это около 4 утра, поэтому и команды, и текст были в беспорядке.
Я снова все соберу воедино.
grep -oP ‘youtube\.com\/watch\?v\=…’ outbox.json > pyaa.txt
Вышеуказанное позволяет использовать регулярные выражения Perl.
Также возможно следующее:
grep -oP ‘youtube\.com\/watch\?v\=.{11}’ outbox.json > pyaa.txt
Кроме того, использование регулярных выражений Perl может быть довольно медленным, поэтому, если у вас много текста или вы используете их в скрипте, возможно, лучше использовать следующую команду, если это возможно.
grep -o ‘youtube\.com/watch?v=…’ outbox.json > pyaa.txt
Кстати, экранирование вопросительного знака возможно только с помощью регулярных выражений Perl?
grep -o ‘youtube\.com/watch\?v=…’ outbox.json > owo.txt
Вышеуказанное не работает.
Без обратной косой черты это будет соответствовать символу, который «совпадает с предыдущим символом 0 или 1 раз».
Итак, я проверил и оказалось, что если заключить [?] в скобки, его можно будет рассматривать как строку.
https://stackoverflow.com/questions/10602433/how-to-escape-a-question-mark-in-r
grep -o ‘youtube\.com/watch[?]v=…’ outbox.json > pyaa.txt
Теперь все в порядке!
Удалим строки, содержащие ненужные «/», «\» и «<»!
Сначала я сомневался в своей команде grep, но это было не так.
Почему-то outbox.json, экспортированный из записей Mastodon, выдает следующий вывод:
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
При ближайшем рассмотрении видно, что последний символ (11-й символ) строки «W7G-QtbTWg» исчез и превратился в обратную косую черту! Конечно, в таком виде URL-адрес не может быть выведен как нормально сохраненный URL-адрес.
youtube.com/watch?v=DRVp_cmW3Nw
youtube.com/watch?v=DRVp_cmW3N\
К счастью, правильно отображаемые URL-адреса также дублируются с помощью grep, поэтому достаточно просто удалить ненужные.
Кроме того, некоторые из них имеют «<» в конце, что это такое...?
sed ‘/\\$\|\/$\|<$/d’ pyaa.txt > nyan.txt
Вывод повторяющихся и неповторяющихся строк с помощью uniq
uniq nyan.txt > nyanya.txt
uniq -u nyan.txt >> nyanya.txt
Готово!!!
Наконец, преобразование в формат yt-dlp с помощью 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
Вот и все! Хорошая работа.
Остальное — это просто добавить #!/bin/bash, дать права на выполнение и запустить. Я не думаю, что кто-то будет копировать и вставлять это, но не забудьте изменить каталог сохранения и т. д.
Наконец, о команде wc...
Вопрос из прошлого раза
echo “youtube.com/watch?v=g5HQFrSk4OA” | wc -c
32
Кажется, 32 символа.
Итак, извлекаем только 32-символьные.
grep -oP ‘^.{32}$’ mstv.txt > mstvtmp.txt
И это было написано так, будто это сработало, но при повторной проверке не получилось. Когда я изменил 32 на 31, это сработало. Почему? Кто-нибудь, объясните, пожалуйста.
Похоже, что команда wc при подсчете символов также включает символ новой строки, поэтому даже пустой файл, созданный с помощью touch, отображает 1. Поэтому при использовании нужно вычитать количество строк.
До скорого.
С наилучшими пожеланиями.