Преобразовать весь текст от верхнего регистра до нижнего регистра и наоборот?

Это кажется, что Вы изменили или сбросили свою переменную среды $HOME на одной из ssh сессий.

$HOME является аргументом по умолчанию для cd встроенный, по крайней мере, для всех подобных sh оболочек, которые я установил в своей системе (включая тире, удар, ksh, и zsh).

У них всех есть что-то вроде этого в их странице справочника (от тире):

 HOME   The home directory of the current user; the default argument for
        the cd builtin command.  The value of this variable is also used
        when performing tilde expansion.
17
08.06.2014, 23:33
6 ответов

Вот прямой путь в 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'
ΑβΓ
20
27.01.2020, 19:46

Хотя это имеет те же ограничения, что уже упоминались как 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
2
27.01.2020, 19:46

POSIX, что невозможно сделать с sed , за исключением предоставления полного набора букв, которые вы хотите транслитерировать, как @cuonglm показал .

Это можно сделать с помощью tr , а tr предназначен для (транслитерировать):

tr '[:lower:][:upper:]' '[:upper:][:lower:]'

Однако в Linux у этого есть ограничения. Из 3 реализаций tr , обычно встречающихся в системах на базе Linux:

  • с GNU tr , которая работает только для однобайтовых наборов символов. Например, на Stéphane Chazelas в локали UTF-8 это дает sTéPHANE cHAZELAS вместо sTÉPHANE cHAZELAS . Это известное ограничение GNU tr .
  • с tr из реликвии, это не работает (вы получаете stéphane chazelas ).
  • Busybox tr этого не делает.

На FreeBSD это работает нормально. Вы ожидаете, что он будет нормально работать и в сертифицированных системах Unix.


В оболочке bash для этого есть специальный оператор:

in=AbCdE
out=${in~~}

С zsh -o extendedglob :

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
16
27.01.2020, 19:46

используя awk:

awk '{print tolower($0)}' file.txt | tee file.txt
1
27.01.2020, 19:46

Keep simple thing simple. Фильтр, предназначенный для перевода символов, - tr.

echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
-1
27.01.2020, 19:46

ruby tiene un método de cadena para eso, un uso similar desde la línea de comando comoperl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

Ver también ruby ​​-doc Codificación

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ
1
27.01.2020, 19:46

Теги

Похожие вопросы