我正在尝试从中获取所有链接materialdesignicons.com
!我执行以下操作:
curl -X GET https://materialdesignicons.com | grep -i "<link href=" | grep -v "<link href="
但它不输出任何东西。一切正常,直到grep -v
!
答案1
让我们来分解一下:
抓取网页
curl -X GET https://materialdesignicons.com
通过模式搜索(不考虑大小写)提供结果
<link href=
grep -i "<link href="
通过搜索符合以下条件的行来提供下一阶段的结果:不匹配模式
<link href=
grep -v "<link href="
结果是,您只能获得<link href=
一个或多个字母大写的文本匹配项。例如
<link href= # Will not match
<link HREF= # Will match
<LinK HrEf= # Will match
如果您想列出所有link href
值,您可以尝试此操作,它将匹配未拆分为多行的链接:
curl -X GET https://materialdesignicons.com | grep -Po "(?<=link href=([\"'])).*?(?=\g1)"
这不是一个特别令人愉快的正则表达式,所以我会尝试为您分解它:
(?<=link href=([\"'])) # Look for "link href=" followed by either single or double quote
.*? # Match and output the shortest possible string until...
(?=\g1) # We have found a repeat of the quote we found earlier
答案2
另一种 grep 解决方案是
grep -iPo "(<link href=\")[^\"]*"
定义[]
了一个字符类,其中仅包含单个字符, a "
,转义 ( \"
) ,原因我希望您能理解,然后该类被否定,^
意思是“任何不是 a 的东西"
”
这翻译为“找到不区分大小写的出现,<link href="
然后匹配所有以下字符,直到找到 a "
,然后停止,但不包括"
”。
不管怎样,因为@roaima打败了我一个正则表达式解决方案,而且我一再被它打败,(显然)不建议用 来解析html grep
,我想我也可以玩一下xmllint
,并且 xpath ( //link/@href
) 可能更容易如果您不熟悉正则表达式,请掌握。
xmllint --html --xpath "//link/@href" <( curl -X GET https://materialdesignicons.com )
这告诉xmllint
我们期待一个--html
文档并使用--xpath
表达式//link/@href
来选择href
所有link
标签中的属性。
然而,xmllint
抱怨从您的 url 下载的 html 格式不正确,因此我们pipe
通过tidy
纠正它,在将格式正确的输出重定向到之前抑制任何冗长 ( -q
) 并丢弃任何错误消息 ( )2>/dev/null
xmllint
xmllint --html --xpath "//link/@href" <( curl -X GET https://materialdesignicons.com | tidy -q 2>/dev/null)
这会产生href
仍然被亲切地(?)用引号括起来的属性
href="/favicon.png" href="//fonts.googleapis.com/css?family=Roboto:400,300" href="styles/css/bootstrap.css" href="styles/app.css"
需要进行一些后处理才能提供裸链接,但现在您可以选择工具。