検索時にカールで完全なアドレスを表示する方法は?

検索時にカールで完全なアドレスを表示する方法は?

完全な住所を表示する必要があります。カール、ステータスコードが「301」の結果が見つかった場合。

これは私の変数です。

search=$(curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o /dev/null | sed 's#404##g') 

echo $search
301

上記の方法は機能しますが、サイトが存在し、ステータスコードが「301」の場合にのみ表示されます。

私の考えでは

echo $search
https://launchpad.net/~mqchael/+archive/pipelight

修正する

ここに私が必要とするものを説明できる新しい変数があります。この変数を使用すると、Ubuntuで同様のppaを検索してインストールできます。

ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=$packagename | grep '<td><a href="/~' | grep ">$packagename<" )

echo $ppa

例:

ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight | grep '<td><a href="/~' | grep ">Pipelight<" )

echo $ppa 

<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>

ここで問題は抽出できないことですmqchael(名前は変更可能です)。パイプライトも単なる例です。

変数を適用するときの最終形式です。

ppa:mqchael/pipelight

答え1

これにより、目的のタスクが実行されます。

curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight |  awk -F/ '/>Pipelight</{print $2}'

説明する:

-F/フィールド区切り記号をに設定します。/これは、「/>Pipelight</一致する唯一の行でコマンドを実行します。したがって、少なくとも公開した例では、行は次のようになります。{}>Pipelight<>Pipelight<

<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>

awkしたがって、分割によって/最初のフィールドはになり、<td><a href="2番目のフィールドはになります~mqchael{print $2}それが印刷される理由です~mqchael

チルダ()も削除するには、~次のコマンドを使用します。

curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight |  
    awk -F/ '/>Pipelight</{print $2}' | sed 's/~//'

答え2

301どのウェブサイトがステータスコードを返すかを調べようとしているようです。実際には、コマンドの内容をcurlファイルに書き込んで実行grepできます。場所ステータスコードのURLを確認してください301。この試み。

curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o
grep 'Location' file1.txt

出力は次のとおりです。

Location: https://launchpad.net/~j/+archive/ppa/pipelight

答え3

code=$desired_HTML_return_code
url="https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight"
_curl=$( curl -o /dev/stderr -sL -w \
    "%{http_code} %{url_effective}\\n" "$url" ) 
[ ${_curl%%[!0-9]*} -eq  $code ] && {\
    ppa="${_curl##*~}"
    ppa="ppa:${ppa%%/*}/${_curl##*namefilter=}" 
}

だから上記をテストしていないが、明らかにこの男はい、そして彼はまた様々な説明をしましたcurl使用できる他の多くのオペランドは言うまでもなく、オペランドも実​​行しています。しかし、ポイントはあなたが使用することですcurlパーサに大きく依存するのではなく、それ自体で出力を保証します。

書かれた通りcurlそれで印刷する必要がありますstdoutそのクエリのhttp戻りコードとユーザーが提供したURLのみがあります。変数である必要はありませんが、読みやすさと証明のために上記です。できるはい。

それでは、次に何をすべきか${彫刻%%*}~から%%私たちの生産量と同じ*できる初めて会うまで[特徴]文字列として!いいえ0-9数字。

だから私たちは[テスト]私たちが望むhttp returnに従って結果を返すことによって得られた数値文字列$code.

&&Ifそれら-equal私たち${strip##*}~から##head私達は救う$_curl最後を含め、できるだけ早く出力~tildeそれを含みますassign=結果が届く$ppa

だから私たちはassign= $ppa再:

文字列 "ppa:" +:

${ppa's}以前の値${less%%*}最初/forward-slashこれには、次のすべての内容が含まれます。

残りのもの$_curl後ろに${removing##*}それから##head 文字列までのすべて"namefilter="

これは他の解決策に比べていくつかの利点がある。

すでに説明したように、curl標準出力は短い文字列のみを保証します。"$code $url"しかし、書かれているように、標準エラーのデバッグのためにhtml結果を端末に送信します。結果はいいえパーサーで使用されます。

これには2つのアプリケーションのみが含まれます。curlそしてそれを呼び出すすべてのPOSIX互換シェル。

結果は現在のシェル環境で明示的にテストされ、サブシェルパイプラインのリモートエンドでは使用されず、正規表現の結果でもありません。

欠点があります:

時によって異なります。"namefilter=$RESULT"URL 文字列の終わりです。それ以外の場合は、ここに適用されたのと同じメカニズムを使用して処理できますが、少なくとも1つ以上のシェルコマンドが必要になることがあります。sedそしてawkどちらも単純検索よりも強力な文字列検索を提供します。${parameter##expansion}球はかつて可能であった。

しかし、私たちはカスタムメイドをするのでcurl~のまず、私たちの目的のために強力な文字列検索は必要ありません。必要なhttpコードを返すだけです。curlそしてあなたの出力は"namefilter=$desired_string"それではどうすればいいのかわかりません。$ppa同じではないはずのものと常に同じである可能性があります。

複数のhttp戻りコードを受け入れる必要がある場合[テスト]次のようにする必要があります。

codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...

関連情報