使用 grep

使用 grep

我正在尝试从中获取所有链接materialdesignicons.com!我执行以下操作:

curl -X GET https://materialdesignicons.com | grep -i "<link href=" | grep -v "<link href="

但它不输出任何东西。一切正常,直到grep -v

答案1

让我们来分解一下:

  1. 抓取网页

    curl -X GET https://materialdesignicons.com
    
  2. 通过模式搜索(不考虑大小写)提供结果<link href=

    grep -i "<link href="
    
  3. 通过搜索符合以下条件的行来提供下一阶段的结果:不匹配模式<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

另一种 gr​​ep 解决方案是

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

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"

需要进行一些后处理才能提供裸链接,但现在您可以选择工具。

相关内容