Прописные прописные буквы в Bash? - PullRequest
2 голосов
/ 16 декабря 2009

Как сделать, чтобы локаль знала операцию в верхнем регистре?

Стандартный метод tr '[: lower:]' '[: upper:]' не работает:

=$ echo żółw | tr "[:lower:]" "[:upper:]"
żółW

(должно быть ŻÓŁW)

Я бы предпочел не запускать Perl или что-то такое тяжелое.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Если ваш bash достаточно новый, он может это сделать (см. bash-4.0 NEWS item 1.hh. ).

bash -c 'foo="żółw"; echo ${foo^^}'

zsh тоже (начиная с 4.3.3?):

zsh -c 'foo="żółw"; echo ${(U)foo}'
1 голос
/ 16 декабря 2009

Мне кажется, что если вы хотите избежать тяжеловеса, вам нужно предоставить персонажей самостоятельно, и, учитывая, что это не является началом для действительно общего решения, вы застряли с использованием тяжеловеса.

Одно тяжелое решение

vinko@parrot:~$ more t.py
# coding: UTF-8
print unicode.upper("żółw".decode('utf-8'))
vinko@parrot:~$ python t.py
ŻÓŁW

Полутяжелое решение, которое потребует от вас указания каждого символа

vinko@parrot:~$ echo żół | tr "[żół]" "[ŻÓŁ]"
ŻÓŁ

РЕДАКТИРОВАТЬ: Основываясь на других ответах и ​​комментариях, BASH 4.0 IS чувствителен к локали и знает широкие символы. Вы должны установить правильный языковой стандарт (LC_CTYPE или LC_ALL), чтобы BASH мог сказать, что он должен делать. Также кажется, что в последнее время есть версии tr, чувствительные к локали (например, Mac OSX 10.6)

...