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
虽然写得好像成功了,但重新验证后发现不行。把32改成31就可以了。咦,为什么?请大家告诉我。
看来,wc命令在计算字符串时会包含行数,即使是使用touch等创建的空文件也会显示1。所以使用时需要减去行数。
那么下次再见。
请多关照。