從連續文本中僅提取YouTube URL的正規表達式grep筆記,然後使用yt-dlp

4 min

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

晚上好,我是無能。

當我dump Mastodon的貼文時,會變成這樣。

/\u003e\u003ca href=\"https://youtube.com/watch?v=jL4NZ913v8E\u0026amp;feature=share\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"ellipsis\"

我想從這段連續的字串中只提取YouTube的URL。

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

雖然寫得好像成功了,但重新驗證後卻失敗了。改成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

在上述步驟中,我已經替換成帶有www的URL了。
或許會有人說,直接用行首的^來搜尋字串不就好了嗎!但我個人喜歡這種從中間字串開始替換的方式,因為感覺重現性更高。

此外,因為包含/,所以sed的分隔符號也使用了|。雖然不使用|也可以啦。

然後,將名稱改為sh格式吧。

mv newmstv.txt ytdl.sh

vi ytdl.sh

然後追加#!/bin/bash。

給予執行權限吧。

chmod +x ./ytdl.sh

(在這裡,突然想到必須用./來執行,現在才做。雖然沒有./也沒差,但如果不安裝就不是男人了。)

然後,執行就可以了。

順帶一提,肯定有辦法在最初的grep階段就乾淨地提取URL字串。我還很菜,請原諒我。因為我還沒追究為什麼會這樣,所以我覺得我反而在做一些麻煩的事情,但這就是一個打各種指令很開心的回合。

結束。