这样做的主要困难是服务返回终端转义代码,这使得处理起来很麻烦。这就是你真正得到:
$ 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 $
这使得这样的:
正因为如此,我们不能只提取了从第一号,因为这会由于转义序列,几乎包括整个行。
幸运的是,我们可以告诉wttr.in不给我们使用?T
查询字符串参数颜色逃逸(帽尖到keheliya指出这一点):
$ 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
获得的示例函数一样。
只是删除所有字符,直到第一个数字已经是一个巨大的改进btw。我试着用'cut'来做,但是无法使它工作。 – vsjn3290ckjnaoij2jikndckjb