Re : 連続したテキストからYoutube URL抜く正規表現grepメモ そこからyt-dlpする ~?(クエスチョン)はエスケープ出来ない!?の巻~

3 min read

こんにちは、無能です。

無能らしいなんの漫画なのかアニメなのか分からない記事のタイトルです。

前回のこの記事。

https://soulminingrig.com/blog/%e9%80%a3%e7%b6%9a%e3%81%97%e3%81%9f%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%81%8b%e3%82%89youtube-url%e6%8a%9c%e3%81%8f%e3%81%a0%e3%81%91%e3%81%a7%e3%81%ae%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%begrep/

このとき、他のウェブスクレイピングするスクリプトを書いてて眠気で死にかけながら朝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

これで無事おk!

いらない"/" と"\"と"<"が存在する行を削除しよう!

最初、自分のgrepコマンドを疑っていたのですが違いました。

なぜかマストドンの書き込みをエクスポートしたoutbox.jsonには以下のような出力が出ます。

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

よく見ると、W7G-QtbTWgという最後の文字列(11文字目)が1文字消えてバックスラッシュになっているではありませんか!。もちろん、このままだと正常に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

できた!!!

最後にsedでyt-dlp形式に

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を追記して実行権限を与え、実行すればおkです。コピペされる方はいないとおもいますが保存先ディレクトリなどの変更は忘れないように。

最後にwcコマンドについて・・・。

前回の疑問点

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

32桁らしい。

ということで32桁のだけ抽出する。

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

と、なんか成功した風に書いてあるが再検証したらうまくいかなかった。32を31にしたらいけた。アレ、なんで?というので誰か教えてください。

どうやら、wcコマンドで文字列をカウントすると行数も含めるようでtouchなどで作成した空のファイルでも1と表示されます。なので使うときは行数文マイナスしなければいけませんね。

それではまた。

よろしくお願い致します