これの主な難点は、サービスが端末のエスケープコードを返すことで、処理が面倒になることです。
$ curl -s wttr.in/Amsterdam | grep -m 1 '°C' | cat -A
^[[38;5;226m _ /""^[[38;5;250m.-. ^[[0m ^[[38;5;048m5^[[0m M-bM-^@M-^S ^[[38;5;046m8^[[0m M-BM-0C^[[0m $
次のようにレンダリング:それはなるので、このため
、私たちは、上の最初の数からすべてを抽出することはできませんこれは、あなた本当に得るものですエスケープシーケンスのためにほぼすべての行を含みます。
幸いなことに、我々は(アウトこれを指し示すためkeheliyaに帽子の先端)私たちに?T
クエリ文字列パラメータを使用したカラーエスケープを送信しないようにwttr.in伝えることができます:
$ curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | cat -A
_ /"".-. 5-8 M-BM-0C $
は、今、私たちはからすべてを抽出することができます最初の桁がgrep -o
(一致のみ保持)を使用して検出されました。また、これは負の温度に対してマイナス記号があるかもしれないことを考慮する:
curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | grep -Eo -e '-?[[:digit:]].*'
または、単一のgrep式で:
curl -s wttr.in/Amsterdam?T | grep -m 1 -Eo -e '-?[[:digit:]].*°C.*'
これの出力は
5–8 °C
ですさて、範囲を取れば平均値だけが必要な場合は、次のような関数を書くことができます:
cur_temp() {
# Get current temperature into variable
local cur=$(curl -s wttr.in/Amsterdam?T \
| grep -m 1 -Eo -e '-?[[:digit:]].*°C.*')
# Check if it is a range
if [[ $cur == *-* ]]; then
# Use regex to extract temperature values
local re='(-?[[:digit:]])+.*-.*(-?[[:digit:]]+)'
[[ $cur =~ $re ]]
local lower=${BASH_REMATCH[1]}
local upper=${BASH_REMATCH[2]}
# Calculate average (truncates to integers)
cur="$(((lower + upper)/2)) °C"
fi
echo "$cur"
}
我々は今、今、私たちは(整数に切り捨て)の平均を取得し、以前の範囲を返された結果にこの関数を呼び出す場合:
$ cur_temp
6 °C
非範囲は前と同じです。
これは、wttr.in/:bash.function
から得られる関数の例のように、場所のパラメータ化が可能です。
最初の数字がすでに大幅に改善されるまで、すべての文字を削除するだけです。私はカットしてやろうとしましたが、うまく動作しませんでした。 – vsjn3290ckjnaoij2jikndckjb