繁体   English   中英

我可以只获取与Grep匹配的字符串部分吗

[英]Can I get only the part of the string that matches with Grep

我有一些HTML,我想从使用grep提取URL。 有没有一种优雅的方法可以做到这一点? 到目前为止,我正在使用wget将html转储到tmp.html文件中。 然后,这就是我正在做的:

awk '/<a href=/,/<\/a\>/' tmp.html | grep -v "sha1|md5" |grep -E "*.rpm?" | tail -1

给定以下字符串类型的列表,我只想提取列表上的最后一个.rpm URL。

<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>

为第三个arg使用GNU awk match()并给出以下输入文件:

$ 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

但没有更多示例输入和预期输出,这只是一个猜测。

-o选项使grep仅输出匹配项,而不打印匹配的完整行。 如果一行中有多个匹配项,则将全部打印。

*.rpm? 不是正则表达式。 如果您想使比赛有意义,则需要非常精确。 可能像

grep -o '"[^"]*.rpm"'

会给你更多的还是少了什么,你正在寻找(但它将输出报价为好,且不会涉及%的URL -escapes。

使用awk可能会做得更好,因为无论如何都在使用它。

用正则表达式解析HTML永远不会像使用真正的HTML解析器那样健壮或容易,就像在这里经常观察到的那样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM