Это кажется, что Вы изменили или сбросили свою переменную среды $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.
Вот прямой путь в 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'
ΑβΓ
Хотя это имеет те же ограничения, что уже упоминались как 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
POSIX, что невозможно сделать с 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
этого не делает. На FreeBSD это работает нормально. Вы ожидаете, что он будет нормально работать и в сертифицированных системах Unix.
В оболочке bash
для этого есть специальный оператор:
in=AbCdE
out=${in~~}
С zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
Keep simple thing simple. Фильтр, предназначенный для перевода символов, - tr
.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
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!'
ΑβΓ