从连续文本中仅提取Youtube URL的正则表达式grep备忘,然后使用yt-dlp
晚上好,我是无能。
如果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字符串的方法。我还是个菜鸟,请原谅我。因为我甚至还没有追究为什么,所以我觉得我反而在做一些麻烦的事情,但这只是一个尝试各种命令并享受乐趣的环节。
结束。