LINUX.ORG.RU

как в bash вытащить символ из строки?

 , ,


0

1

Добрвремсуток, джентльмены.

Прелюдия: Захотел погоду наблюдать при открытии терминала и добавил в .bashrc следующее:

$ curl -s ru.wttr.in/grytviken | sed '2,7!d'

Проблема: В выборке используются символы (диагональные стрелки, указывающие направления ветра), которые моим шрифтом (terminus) не поддерживаются.

Хотел записать в .bashrc условие, которое заменит символы на слова (северо-западный, южный и т.д.), но не смог выделить символ из строки. Визуально он постоянно находится на одной и той же позиции, но так как текст местами цветной, то из-за спецсимволов его фактическое положение в строке плавает, поэтому cut не подходит (а может, я просто не умею им пользоваться).

Попытался вырезать всё ненужное:

curl -s ru.wttr.in/uaa | sed '5!d' | tr -d [:space:][:punct:][:alnum:][:cntrl:]
Но вместе с символом остаётся ещё какая-то шняга.

Подскажите, 1. Как можно выделить символ из строки в данной ситуации? 2. Можно ли как-то иначе решить задачу с отображением символов?

Замена шрифта не подходит.

Решение: Добавил в .bashrc cледующее:

#погода
E=$(echo -e "\u2190")
S=$(echo -e "\u2191")
W=$(echo -e "\u2192")
N=$(echo -e "\u2193")
SE=$(echo -e "\u2196")
SW=$(echo -e "\u2197")
NW=$(echo -e "\u2198")
NE=$(echo -e "\u2199")
curl -s ru.wttr.in/grytviken?0 | tail -6 | sed "s/$N/ветер северный/; s/$NE/ветер северо-восточный/; s/$E/ветер восточный/; s/$SE/ветер юго-восточный/; s/$S/ветер южный/; s/$SW/ветер юго-западный/; s/$W/ветер западный/; s/$NW/ветер северо-западный/"
echo

$ curl -s ru.wttr.in/grytviken | sed '2,7!d'

Можно просто curl -s ru.wttr.in/grytviken?0

которые моим шрифтом (terminus) не поддерживаются.
2. Можно ли как-то иначе решить задачу с отображением символов?

Наверное.

madcore ★★★★★ ()
Ответ на: комментарий от dada

1. Я использовал od -h для этого, вывод с hexdump'ом идeнтичен. Чувствую у себя большой пробел в знаниях по кодированию Юникода, потому что в разных ситуациях дамп одного и того же символа (например, U+2196) давал разные результаты (0096, 0a96 и 0b96. Я пользую UTF-8). Не знаю, с чем это связано, буду гуглить. Скорее всего что-то не так делаю.

2. Вы навели меня на банальное, в принципе, решение, которое работает. Видать, вчера я был уже не в адеквате и городил что-то чересчур сложное.

basarga ()
Ответ на: комментарий от madcore

$ curl -s ru.wttr.in/grytviken | sed '2,7!d'

Можно просто curl -s ru.wttr.in/grytviken?0

Спасибо, так намного лучше.

которые моим шрифтом (terminus) не поддерживаются.
2. Можно ли как-то иначе решить задачу с отображением символов?

Наверное.

Интересно, но, увы, мне не подходит.

basarga ()

в общем, решил добавлением в .bashrc следующих строк:

#погода
E=$(echo -e "\u2190")
S=$(echo -e "\u2191")
W=$(echo -e "\u2192")
N=$(echo -e "\u2193")
SE=$(echo -e "\u2196")
SW=$(echo -e "\u2197")
NW=$(echo -e "\u2198")
NE=$(echo -e "\u2199")
curl -s ru.wttr.in/vladivostok?0 | sed "s/$N/ветер северный/; s/$NE/ветер северо-восточный/; s/$E/ветер восточный/; s/$SE/ветер юго-восточный/; s/$S/ветер южный/; s/$SW/ветер юго-западный/; s/$W/ветер западный/; s/$NW/ветер северо-западный/"
echo

basarga ()
Ответ на: комментарий от madcore

Не запрещает. Я изначально пытался слепить case с вариантами стрелок, но не мог выделить в условие символ из строки. Возник затык, в который я упёрся, как баран, и, не видя других вариантов, копал не в ту сторону. Отоспавшись, увидел вариант с sed. Символы в vim'е нечитаемы, поэтому, чтобы не запутаться завёл переменные.

basarga ()