Re : 從連續文本中提取 Youtube URL 的正則表達式 grep 筆記 並從中進行 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 指令有問題,但事實並非如此。
不知為何,從 Mastodon 導出的 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
仔細一看,最後的字串(第 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
完成了!!!
最後用 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,賦予執行權限,然後執行即可。我想應該沒有人會直接複製貼上,但請不要忘記更改保存目錄等設定。
最後關於 wc 指令...
上次的疑問點
echo “youtube.com/watch?v=g5HQFrSk4OA” | wc -c
32
據說是 32 位。
因此,只提取 32 位的。
grep -oP ‘^.{32}$’ mstv.txt > mstvtmp.txt
雖然寫得好像成功了,但重新驗證後卻失敗了。改成 31 就可以了。奇怪,為什麼?請大家告訴我。
看來,wc 指令在計算字串時會包含行數,即使是使用 touch 等建立的空檔案也會顯示 1。所以使用時必須減去行數。
那麼下次再見。
請多關照