能否只获取与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>
-o
选项使 grep 只打印匹配项,而不是匹配的整行。如果一行中有多个匹配项,则会打印所有匹配项。
*.rpm?
不是正则表达式。如果你想让匹配有意义,你需要非常精确;可能像
grep -o '"[^"]*.rpm"'
或多或少会给你你正在寻找的东西(但它也会输出引号,并且不会处理 URL.[=16= 中的 %
-escapes ]
你可能会用 awk
做得更好,因为无论如何你都在使用它。
使用正则表达式解析 HTML 永远不会像使用真正的 HTML 解析器那样健壮或容易,observed frequently here。
使用 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([=11=],/<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([=12=],/<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
但没有更多样本输入和预期输出,这只是猜测。
我有一些 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>
-o
选项使 grep 只打印匹配项,而不是匹配的整行。如果一行中有多个匹配项,则会打印所有匹配项。
*.rpm?
不是正则表达式。如果你想让匹配有意义,你需要非常精确;可能像
grep -o '"[^"]*.rpm"'
或多或少会给你你正在寻找的东西(但它也会输出引号,并且不会处理 URL.[=16= 中的 %
-escapes ]
你可能会用 awk
做得更好,因为无论如何你都在使用它。
使用正则表达式解析 HTML 永远不会像使用真正的 HTML 解析器那样健壮或容易,observed frequently here。
使用 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([=11=],/<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([=12=],/<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
但没有更多样本输入和预期输出,这只是猜测。