Ответы:
Вот прямой путь в sed
:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
или более короткий путь с GNU sed
, работающий с любым символом, для которого в вашей локали существует преобразование в нижний регистр <->:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
если вы можете использовать другие инструменты, такие как:
perl
(ограничено буквами ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl
(в более общем смысле):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed
и альтернативного регистра на входе. Используйте sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
вместо этого (все еще специфично для GNU). Первая конвертирует только 26 латинских букв ASCII, а вторая - любую букву, распознаваемую как таковую вашей локалью. tr
Один имеет смысл только в ASCII местах. perl
Один работает только для ASCII латинских букв.
POSIXly, это не может быть сделано, sed
кроме как путем предоставления полного набора букв, которые вы хотите транслитерировать, как показано @cuonglm .
Это может быть сделано с помощью tr
, и вот для чего tr
(транслитерация):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Однако в Linux у него есть ограничения. Из 3 tr
реализаций, обычно встречающихся в системах на основе Linux:
tr
это работает только для однобайтовых наборов символов. Например, Stéphane Chazelas
в локалях UTF-8 это дает sTéPHANE cHAZELAS
вместо sTÉPHANE cHAZELAS
. Это известное ограничение GNU tr
.tr
помощью инструмента семейной реликвии, это не работает (вы понимаете stéphane chazelas
).tr
будет делать busybox .На FreeBSD это работает нормально, хотя. Вы ожидаете, что он будет работать нормально и в сертифицированных системах Unix.
В bash
оболочке есть специальный оператор для этого:
in=AbCdE
out=${in~~}
С zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ
(e2 b4 a0) является Ⴠ
(e1 83 80); оба i
(69) и ı
(c4 b1) имеют I
(49) в верхнем регистре (за исключением турецких языков, где i
ставится İ
). Причина, по которой он не работает с GNU, tr
заключается в том, что GNU tr
работает с байтами, а не с символами.
[:lower:]
или [:upper:]
(так что первое игнорируется). Даже на французском œ -> Œ
есть c5 93 -> c5 92
в UTF-8 и bd -> bc
в iso8859-15.
Хотя это имеет те же ограничения, которые уже упоминались в качестве tr
решения, предложенного Стефаном Шазеласом, это еще один способ сделать это:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
Я сваливать stderr
в /dev/null
там , потому что dd
также предоставляет статистику всех своих операций на 2
дескрипторе файла. Это может быть полезно в зависимости от того, что вы делаете, но не для этой демонстрации. Все остальные вещи, с которыми вы можете работать, по- dd
прежнему применимы, например:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
не конвертируется в AbC
).
Если вашей главной целью является преобразование файла из нижнего класса в верхний класс, почему бы вам не использовать tr
и STDOUT
преобразовать ваш файл:
$cat FILENAME | tr a-z A-Z > FILENAME2
где FILENAME
ваш оригинальный файл? Где FILENAME2
ваш конвертированный выходной файл.
é
например (по крайней мере, в моем файле).
используя awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
будет начинаться с усечения файла
ruby
для этого есть строковый метод, похожий на использование из командной строки perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Смотрите также ruby-doc Encoding
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Оставь простую вещь простой. Фильтр предназначен для перевода символов tr
.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
tr
было бы более подходящим, чемsed
.