Я в процессе создания bash-скрипта для скрапинга weather.com с целью получения прогноза погоды. Мне нужно обработать строку текста, содержащую необычный символ. Вот текст:
30°FВысокая 35°Высокая 52°Высокая 45°Высокая 43°Высокая
Между цифрами и буквами есть маленький кружок. Вот код:
#!/bin/bash
clear
lynx --dump http://www.weather.com/weather/5-day/New+York+NY+10001 | \
egrep ' Today | Tonight ' -A 22 | awk 'BEGIN {print "\n\t\t\b\b\b\b\b\bTHE FIVE DAY\
WEATHER REPORT FOR THE NYC: 10001\n"} \
/[0-9][0-9]*[a-z|A-Z]+/{print $1"\t\t"$2" "$3"\t\t"$4" "$5"\n"}' 2>> error.txt
Это не дает никакого результата.
решение1
Самый простой способ — использовать точку, соответствующую символу градуса.
/[0-9][0-9]*.[a-z|A-Z]+/
Например
$ echo -e "30\0260FHigh" \
| awk '/[0-9][0-9]*.[a-z|A-Z]+/ { print "yes" }'
yes
(\0260 — восьмеричное число для обозначения градуса в вашем вопросе)
Если вы хотите точно сопоставить его, вам придется определить его значение в используемой кодировке. В тексте вашего вопроса это, кажется, 0xb0.
$ echo -e "30\0260FHigh" \
| awk '/[0-9][0-9]*\xb0[a-z|A-Z]+/ {print "yes" }'
yes
\0260 и \xb0 просто иллюстрируют два способа обозначить одно и то же.
решение2
Современная оболочка Linux очень хорошо понимает Unicode. На самом деле, я думаю, что все данные обрабатываются как UTF-8.
У меня не возникло проблем с запуском этого кода:
$ echo ° | awk '/°/{print "found it"}'
found it
Если вы создаете скрипт оболочки, убедитесь, что он в кодировке UTF-8, а не ASCII.