#!/usr/bin/env bash
URL_1=http://www.squid-cache.org/Versions/
URL_2=$(curl "$URL_1" | sed -n '/Stable Versions/{p; :loop n; p; /rolling/Iq; b loop}' | grep -i rolling | cut -d \" -f 2)
URL_3=$(curl "$URL_1""$URL_2" | sed -n '/Latest/{p; :loop n; p; /.gz/q; b loop}' | grep .gz | cut -d \" -f 2)
wget "$URL_1""$URL_2""$URL_3"
上記のコードを1行に減らす方法はありますか?
物事をダウンロードするためにあまりにも多くの変数を定義するのは良いことではありません。
ベストアンサー1
裏地1個、注文方法 :)
URL_1
読みやすくするために変数を使用します。必要ありません。
#!/bin/bash
URL_1=http://www.squid-cache.org/Versions/
curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p' |
xargs -I{} wget "${URL_1}"{}
grep -Pzo '(?s)Stable Versions.*?langpack'
-P
パターンをPerl互換正規表現として解釈します。-z
複数行検索に必要なオプションです。-o
一致する行に一致する(空でない)部分のみを印刷します。(?s)
残りの正規表現では、「Dot Match Newline」を有効にします。情報:インライン修飾子。.*?
貪欲なマッチング。
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p'
- ここを作ってください:
v3/3.5/squid-3.5.26.tar.gz
$,$
最後の行のみが処理されます。- スラッシュとタグがある
s
ため、ubstituteコマンドでスラッシュの代わりにアンダースコアを使用しています。例: 代わりに</tr>
</td>
s_foo_bar_
s/foo/bar/
- ここを作ってください:
xargs -I{} wget "${URL_1}"{}
wget
パスxargs
:http://www.squid-cache.org/Versions/
接続されている2つの部分をに渡しますv3/3.5/squid-3.5.26.tar.gz
。
編集 - xargsのないバージョン(ここでは必要ありません):
#!/bin/bash
URL_1=http://www.squid-cache.org/Versions/
wget "${URL_1}$(curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p')"