Re: 从连续文本中提取YouTube URL的正则表达式grep笔记,并用yt-dlp处理 ~问号(?)无法转义!?篇~

3 min

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

大家好,我是无能。

这是一个无能的我,连是漫画还是动画都分不清的文章标题。

上一篇文章。

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

虽然写得好像成功了,但重新验证后发现不行。把32改成31就可以了。咦,为什么?请大家告诉我。

看来,wc命令在计算字符串时会包含行数,即使是使用touch等创建的空文件也会显示1。所以使用时需要减去行数。

那么下次再见。

请多关照。

Related Posts