В обратный регистр

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

sedikpoll
Сообщения: 100

В обратный регистр

Сообщение sedikpoll »

Существует строка


Задача состоит в том что бы изменить регистр букв, т.е. получить


Могу привести строчку к одному регистру (tr A-Z a-z), но вот как изменить на противоположный?

Спасибо.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: В обратный регистр

Сообщение /dev/random »

Решение "в лоб": выберите временный диапазон где-нибудь в дальней части юникода и используйте 3 команды tr (а-ля "t=a; a=b; b=t;")
Возможно, существует и специализированное решение.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: В обратный регистр

Сообщение SLEDopit »

/dev/random писал(а):
11.06.2010 23:21
Решение "в лоб": выберите временный диапазон где-нибудь в дальней части юникода и используйте 3 команды tr (а-ля "t=a; a=b; b=t;")
Решение в лоб это:

Код: Выделить всё

echo dfVmGJH | sed 'y/AaBbCcDdEeFfGgHhJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz/aAbBcCdDeEfFgGhHjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ/'
А так, возможно, есть какое-то более изящное решение.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: В обратный регистр

Сообщение drBatty »

sedikpoll писал(а):
11.06.2010 23:11
Могу привести строчку к одному регистру (tr A-Z a-z), но вот как изменить на противоположный?

Код: Выделить всё

doc@bx:~/tests$ echo 'xXAa' | hexdump -x
0000000    5878    6141    000a

итого, буквы отличаются одним битом - операция XOR 0x20 вам поможет
есть в C/C++
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: В обратный регистр

Сообщение /dev/random »

drBatty писал(а):
11.06.2010 23:41
есть в C/C++

С учётом раздела, в котором задан вопрос, решение немножко не в тему )
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: В обратный регистр

Сообщение drBatty »

ЗЫЖ в виме ~
а в sed...
что-то в голову не лезет...
sed -r 's/[A-Z]/\L<&>/g;s/(^|>)\w+(<|$)/\U&/g;s/\W//g'
готичненько...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
reji
Сообщения: 81

Re: В обратный регистр

Сообщение reji »

Вот такой вариант, читерский:
$ echo -e "QweAsd\nERT" | python -c "import sys; [sys.stdout.write(s.swapcase()) for s in sys.stdin]"
qWEaSD
ert
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: В обратный регистр

Сообщение /dev/random »

SLEDopit писал(а):
11.06.2010 23:28
/dev/random писал(а):
11.06.2010 23:21
Решение "в лоб": выберите временный диапазон где-нибудь в дальней части юникода и используйте 3 команды tr (а-ля "t=a; a=b; b=t;")
Решение в лоб это:

Код: Выделить всё

echo dfVmGJH | sed 'y/AaBbCcDdEeFfGgHhJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz/aAbBcCdDeEfFgGhHjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ/'
А так, возможно, есть какое-то более изящное решение.

Тпру, стоять. Я идиот.
tr 'a-zA-Z' 'A-Za-z'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: В обратный регистр

Сообщение drBatty »

PPS

Код: Выделить всё

sed -r 's/.*/<&>/;s/[A-Z]+/\L>&</g;s/<(\w*)>/\U\1/g'


/dev/random писал(а):
11.06.2010 23:54
tr 'a-zA-Z' 'A-Za-z'

а... точно... я и забыл :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: