我有一些html,我想从使用grep中提取URL。有一种优雅的方式来做到这一点?到目前为止,我使用wget将html转储到tmp.html文件中。然后,这就是我正在做的事情:
awk '/<a href=/,/<\/a\>/' tmp.html | grep -v "sha1|md5" |grep -E "*.rpm?" | tail -1
如果列出了以下类型的字符串,我只想拉出列表中的最后一个.rpm网址。
<td><a href="http://maven-whatever:8081/nexus/content/repositories/snapshots/com/whatever/whatever/adv-svcs/something/0.0.1-SNAPSHOT/something-0.0.1-20150227.161014-81-sles11_64.rpm">something-0.0.1-20150227.161014-81-sles11_64.rpm</a></td>
答案 0 :(得分:2)
使用GNU awk为第3个arg匹配()并给出此输入文件:
$ cat file
<td><a href="http://maven-whatever:8081/nexus/content/repositories/snapshots/com/whatever/whatever/adv-svcs/something/0.0.1-SNAPSHOT/something-0.0.1-20150227.161014-81-sles11_64.rpm">something-0.0.1-20150227.161014-81-sles11_64.rpm</a></td>
这可能是你想要的:
$ cat tst.awk
match($0,/<a href=.*>(.*\.rpm)<\/a\>/,a) && !/sha1|md5/ {url=a[1]} END{print url}
$ gawk -f tst.awk file
something-0.0.1-20150227.161014-81-sles11_64.rpm
或者这个:
$ cat tst.awk
match($0,/<a href="([^"]+\.rpm)".*<\/a\>/,a) && !/sha1|md5/ {url=a[1]} END{print url}
$ gawk -f tst.awk file
http://maven-whatever:8081/nexus/content/repositories/snapshots/com/whatever/whatever/adv-svcs/something/0.0.1-SNAPSHOT/something-0.0.1-20150227.161014-81-sles11_64.rpm
但没有更多的样本输入和预期的输出就是猜测。
答案 1 :(得分:1)
-o
选项会导致grep仅打印匹配项,而不是匹配的完整行。如果一行中有多个匹配,则将打印所有匹配。
*.rpm?
不是正则表达式。如果你想使比赛有意义,你需要非常精确;可能像
grep -o '"[^"]*.rpm"'
会为您提供更多或更少的内容(但它也会输出引号,并且不会处理%
- 在网址中转义。
你可以用awk
做得更好,因为无论如何你都在使用它。
使用正则表达式解析HTML永远不会像使用真正的HTML解析器一样强大也不容易,就像observed frequently here一样。