请教大佬们一个 regex 的问题。背景是一个只含大量超链接的 html 网页,需要从这些超链接中筛选出指定的链接并下载,大概的代码如下:
wget www.abc.com/result.html
res_url=$something
wget $res_url
result.html 长下面这样:
<a href='www.abc.com/file1'>file1<br/><br/><a href='www.abc.com/file2'>file2<br/><br/><a href='www.abc.com/file3'>file3<br/><br/><a href='www.abc.com/file4'>file4<br/><br/>
res_url 长这样:
我之前的方法如下:
tmp=$(grep -o "file2.*/file3" result.html)
res_url=$(echo "$tmp" | grep -o "http.*/file3")
但是现在的问题是,这些超链接的顺序是变化的,有可能 file3 的链接下次就在 file2 之前,上面的方法不太稳定。请教各位大佬,怎么使用 shell 的正则表达式来从如下的原始字符串中提取出目标字符串呢?
1
TimePPT 2021-01-10 13:42:26 +08:00
专业的事交给专业的工具吧,这个需求 lxml 这种 python 解析库几行的事
|
2
wd 2021-01-10 13:45:58 +08:00 via iPhone
我看了一会实在看不懂楼主的问题.. 放弃了
|
3
gnomeek OP @wd hhh- -其实就是一个 jenkins 的 build_result.html,需要写一个脚本来提取出 build 中的一些文件(也就是指定的超链接)
|
4
gnomeek OP @TimePPT 是的,用 python 会方便很多。不过还是用 bash 解决了- -看来还是不能加班,脑子都快成浆糊了
|
5
gnomeek OP 解决了
``` wget www.abc.com/build_result.html array=($(grep -ohr -E "https?://[a-zA-Z0-9\.\/_&=@$%?~#-]*" build_result.html)) for element in ${array[@]} do if [[ "$element" == *"/file2"* ]]; then wget $element fi done ``` |
6
Lax 2021-01-10 14:25:48 +08:00
最好用专业的工具,使用 xpath 或者 css selector 的库去选择对应的元素。
如果非要用正则,就好好看看文档。具体到这里,可以先把全部链接( href )匹配出来,再进行处理。 > grep -i -E -o "href='([^']*file[0-9]*)'" |
7
imn1 2021-01-10 14:26:40 +08:00
问题是你的正则为何这样写?关 file2 什么事?能匹配 href...file3 这段就够了啊
自己搜索一下正则的贪婪、非贪婪 |
8
gnomeek OP @imn1 但是他们的 prefix 是一模一样,且不确定的。比如会有一些版本号的信息,如 www.abc.com/123/file1.txt 这样,每次的版本号都不一样,没法那么精细的匹配
|