我是否只能获得与Grep匹配的字符串部分

时间:2015-02-27 17:57:17

标签: regex bash awk grep

我有一些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>

2 个答案:

答案 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一样。