
私はそれからすべてのリンクを取得しようとしていますmaterialdesignicons.com
!私は次のことを行います。
curl -X GET https://materialdesignicons.com | grep -i "<link href=" | grep -v "<link href="
しかし、何も出力されません。まですべてがうまく動作しますgrep -v
!
答え1
分析してみましょう。
Webクロール
curl -X GET https://materialdesignicons.com
パターン検索で結果を提供(大文字と小文字を問わない)
<link href=
grep -i "<link href="
次のステップの結果は、一致する行を検索することによって提供されます。矛盾モデル
<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
選択することを意味します。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"
ネイキッドリンクを提供するにはいくつかの後処理が必要ですが、選択できるツールがあります。