如何用grep/sed从含多个匹配的单行中提取指定Blender下载URL?
解决ripgrep匹配Blender下载链接时的贪婪匹配问题
问题原因
你使用的rg -o 'https.*tar\.xz'命令出现跨链接匹配的核心原因是正则中的.*为贪婪匹配模式,会尽可能多的匹配字符,只要同一行内存在多个https://开头和.tar.xz结尾的内容,就会将中间所有内容合并为一个匹配结果。
解决方案
方案1:通用提取所有独立.tar.xz链接(推荐)
利用HTML中链接都包裹在双引号内的特性,用[^"]替代.*匹配路径,匹配时遇到双引号就自动停止,完全避免贪婪匹配问题,兼容性最强:
rg -o 'https://[^"]*\.tar\.xz'
如果只需要提取Linux版本的链接,可增加特征过滤:
rg -o 'https://[^"]*linux.*\.tar\.xz'
方案2:使用非贪婪匹配
ripgrep默认支持PCRE2语法,将.*替换为非贪婪匹配符号.*?,会在匹配到第一个.tar.xz后缀时就停止,自动拆分同一行的多个链接:
rg -o 'https://.*?\.tar\.xz'
方案3:精准匹配指定版本链接
如果明确需要匹配目标版本,可直接在正则中加入版本特征,直接命中目标结果:
rg -o 'https://[^"]*blender-3\.0\.0-alpha\+cycles-x.*linux\.x86_64.*\.tar\.xz'
实际使用示例
结合curl直接拉取页面并提取目标链接的完整命令:
curl -s https://builder.blender.org/download/experimental/ | rg -o 'https://[^"]*\.tar\.xz' | grep '3.0.0-alpha+cycles-x.*linux.x86_64-release'
运行后会直接输出你需要的目标URL:https://builder.blender.org/download/experimental/blender-3.0.0-alpha+cycles-x.a117a9c63c3a-linux.x86_64-release.tar.xz
内容的提问来源于stack exchange,提问作者MichaelScofield45
相关产品推荐
相关产品推荐

