如何从YouTube订阅页面HTML源码中提取/user/CHANNELNAME格式的频道路径
如何从YouTube订阅页面HTML源码中提取/user/CHANNELNAME格式的频道路径
嘿,我来帮你搞定这个grep贪婪匹配的坑!你遇到的问题完全是因为正则里的.*是“贪婪”的——它会尽可能匹配最多的内容,所以才会把后面一大串字符都带进来。咱们换两种思路就能轻松解决:
方法一:用排除型字符类(通用所有grep版本)
这是最稳妥的办法,直接限定匹配的字符范围,不让它“贪多”:
grep -o '/user/[^"]*' source
解释一下:[^"]的意思是匹配任何不是双引号的字符,后面的*表示可以匹配零个或多个这类字符。这样grep会从/user/开始,一直匹配到第一个双引号就立刻停止,正好精准提取出你要的/user/CHANNELNAME。
方法二:用非贪婪匹配(适合支持Perl正则的grep)
如果你的系统用的是GNU grep(大部分Linux系统默认都是),可以启用Perl兼容正则来实现非贪婪匹配:
grep -oP '/user/.*?(?=")' source
这里的-P参数是开启Perl正则支持,.*?是.*的非贪婪版本——它会尽可能少地匹配字符,加上(?=")这个正向预查(意思是“后面必须跟着双引号,但不把双引号包含进匹配结果”),就能直接拿到不带引号的目标路径。
举个实际例子,针对你给出的那段源码:
"url":"/user/CHANNELNAME","webPageType":"WEB_PAGE_TYPE_CHANNEL","rootVe":3611,"apiUrl":"/youtubei/v1/browse"
用上面任意一个命令,都会输出:/user/CHANNELNAME,完全符合你的需求!
备注:内容来源于stack exchange,提问作者Broadsworde
相关产品推荐
相关产品推荐

