grepを使う

grepを使う

私はそれからすべてのリンクを取得しようとしていますmaterialdesignicons.com!私は次のことを行います。

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

しかし、何も出力されません。まですべてがうまく動作しますgrep -v

答え1

分析してみましょう。

  1. Webクロール

    curl -X GET https://materialdesignicons.com
    
  2. パターン検索で結果を提供(大文字と小文字を問わない)<link href=

    grep -i "<link href="
    
  3. 次のステップの結果は、一致する行を検索することによって提供されます。矛盾モデル<link href=

    grep -v "<link href="
    

その結果、<link href=1つ以上の大文字に一致するテキストのみを取得できます。例えば

<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の解析には推奨されないので、xpath()でgrep遊んでみるのが良いと思いました。正規表現に慣れていない場合は、必ずお読みください。 xmllint//link/@href

xmllint --html --xpath "//link/@href" <( curl -X GET https://materialdesignicons.com )

これは、文書をxmllint予測し--html--xpath式を使用してすべてのタグの属性を//link/@href選択することを意味します。hreflink

しかし、xmllintあなたのURLからダウンロードしたhtmlの形式が正しくないと文句を言うので、正しい形式の出力を次にリダイレクトする前に詳細を抑制し、エラーメッセージを削除してpipeそれを修正します(tidy-q2>/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"

ネイキッドリンクを提供するにはいくつかの後処理が必要ですが、選択できるツールがあります。

関連情報