Re : Заметки о регулярных выражениях grep для извлечения URL-адресов YouTube из непрерывного текста и последующего использования yt-dlp ~Невозможно экранировать ? (вопросительный знак)!?~

6 min

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

Привет, я бездарь.

Это название статьи, которое, как и следовало ожидать от бездаря, непонятно, из какого оно аниме или манги.

Предыдущая статья.

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. Поэтому при использовании нужно вычитать количество строк.

До скорого.

С наилучшими пожеланиями.

Related Posts