从连续文本中仅提取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和不带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字符串的方法。我还是个菜鸟,请原谅我。因为我甚至还没有追究为什么,所以我觉得我反而在做一些麻烦的事情,但这只是一个尝试各种命令并享受乐趣的环节。

结束。