我有一个Bash脚本,它使用cURL获取一个巨大的HTML,其中包含遵循特定模式的URL。
图案:
https://mycoolsite.com/deliveries/{UUID}.bin
示例:
https://mycoolsite.com/deliveries/e4e8c143b2c59f58eb52a03f2cc2d36c4a9fee3b.bin
HTML有一行JSON对象列表,如下所示:
{"type":"hd_mp4_video",...,"container":"mp4"...,{"max_bitrate":290836,...},"url":"https://mycoolsite.com/deliveries/e4e8c143b2c59f58eb52a03f2cc2d36c4a9fee3b.bin","created_at":1556973749,"segment_duration":3,"opt_vbitrate":5625}
具有不同"的其他JSON对象;类型">存在,但我的完整用例是查找hd_mp4_video。
然而,如果我能找到所有与模式匹配的URL,或者如果我能准确地选择第n个匹配,我就能找到办法。
我想做一些类似的事情
origin_url="https://mycoolsite.com/embed/iframe/2dkmdf59gy"
html=$(curl GET $origin_url)
bin_url=$(#Extract the URL(s))
echo bin_url
示例"UUID";您给定的值似乎只由数字和小写字符组成,没有作为分隔符的减号,并且正好由40个字符组成,因此匹配这些URL的适当POSIX扩展正则表达式是:
https://mycoolsite.com/[0-9a-f]{40}.bin
(如果可能存在差异,请查看POSIX扩展正则表达式语法,并相应地调整正则表达式。(
考虑到这一点,您可以使用sed
实用程序提取它们:
curl "$url" | sed -rn 's_.*(https://mycoolsite.com/[0-9a-f]{40}.bin).*_1_p'
请注意,我使用_
而不是/
作为sed的s
命令的分隔符,因为regex包含/
个字符。
切换到sed的r
启用扩展的regex语法,而n
切换告诉sed不要自动打印任何内容。
然后,s
命令末尾的p
选项显式打印成功进行正则表达式替换的任何行。在这种情况下,该替换会删除匹配正则表达式前后的任何内容。
请注意,虽然这将在输入中打印多个URL,但它不会打印同一行中出现的两个URL,因为我们使用的正则表达式将在一行中的第一个匹配之后丢弃任何内容。
curl .... | sed -rn '/type:hd_mp4_video/s@(^.*url:)(.*)(,created.*$)@2@p'
搜索类型为和hd_mp4_video的行。根据正则表达式将该行拆分为三个部分,并将该行仅替换为第二个部分(实际URL(,打印结果。
Perl版本打印整个列表:
curl ... | perl -ne 'map { print("$_n") } /"url":"([^"]+)/g'