На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
sedikpoll
Сообщения: 100
Сообщение
sedikpoll » 11.06.2010 23:11
Существует строка
Задача состоит в том что бы изменить регистр букв, т.е. получить
Могу привести строчку к одному регистру (tr A-Z a-z), но вот как изменить на противоположный?
Спасибо.
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo
Сообщение
/dev/random » 11.06.2010 23:21
Решение "в лоб": выберите временный диапазон где-нибудь в дальней части юникода и используйте 3 команды tr (а-ля "t=a; a=b; b=t;")
Возможно, существует и специализированное решение.
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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/'
А так, возможно, есть какое-то более изящное решение.
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
Сообщение
drBatty » 11.06.2010 23:41
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++
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo
Сообщение
/dev/random » 11.06.2010 23:45
drBatty писал(а): ↑ 11.06.2010 23:41
есть в C/C++
С учётом раздела, в котором задан вопрос, решение немножко не в тему )
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 11.06.2010 23:48
ЗЫЖ в виме ~
а в sed...
что-то в голову не лезет...
sed -r 's/[A-Z]/\L<&>/g;s/(^|>)\w+(<|$)/\U&/g;s/\W//g'
готичненько...
reji
Сообщения: 81
Сообщение
reji » 11.06.2010 23:50
Вот такой вариант, читерский:
$ echo -e "QweAsd\nERT" | python -c "import sys; [sys.stdout.write(s.swapcase()) for s in sys.stdin]"
qWEaSD
ert
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo
Сообщение
/dev/random » 11.06.2010 23:54
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
Сообщение
drBatty » 12.06.2010 00:01
PPS
Код: Выделить всё
sed -r 's/.*/<&>/;s/[A-Z]+/\L>&</g;s/<(\w*)>/\U\1/g'
а... точно... я и забыл :)