이 서비스의 주된 어려움은 터미널 이스케이프 코드를 반환하기 때문에 처리하기가 쉽지 않습니다. 이것은 무엇인지 정말 얻을 : 같은 렌더링
$ 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:]].*'
또는 :
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"
}
01 23,516,
우리가 이전에 지금 우리가 (정수로 절단) 평균 얻을 범위를 반환 결과에이 함수를 호출하는 경우 :
$ cur_temp
6 °C
비 범위는 이전과 동일합니다.
wttr.in/:bash.function
에서 가져 오는 예제 함수에서와 같이 위치를 매개 변수화 할 수 있습니다.
첫 번째 숫자가 이미 큰 btw로 개선 될 때까지 모든 문자를 삭제하십시오. 나는 '컷 (cut)'으로 그 일을 시도했지만 작동시키지 못했습니다. – vsjn3290ckjnaoij2jikndckjb