Respostas:
Aqui está uma maneira direta de sed:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
ou uma maneira mais curta com o GNU sed, trabalhando com qualquer caractere para o qual exista uma conversão em minúsculas <-> maiúsculas no seu código do idioma:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
se você pode usar outras ferramentas, como:
perl (limitado a cartas ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl (De forma geral):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sede um caso alternativo na entrada. Use em sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'vez disso (ainda específico do GNU). O primeiro converte apenas as 26 letras latinas ASCII, enquanto o segundo converte qualquer letra reconhecida como tal pela sua localidade. O trúnico faz sentido em locais ASCII. O perlúnico funciona para letras latinas ASCII.
POSIXIAMENTE, isso não pode ser feito, sedexceto fornecendo o conjunto completo de letras que você deseja transliterar como o @cuonglm mostrou .
Poderia ser feito com isso tr, e tré para isso (transliterar):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
No entanto, no Linux, há limitações. Das 3 trimplementações comumente encontradas em sistemas baseados em Linux:
tr, que funciona apenas para conjuntos de caracteres de byte único. Por exemplo, em Stéphane Chazelaslocalidades UTF-8, isso fornece em sTéPHANE cHAZELASvez de sTÉPHANE cHAZELAS. Essa é uma limitação conhecida do GNU tr.trpartir da caixa de ferramentas da herança, isso não funciona (você entende stéphane chazelas).trfará.No FreeBSD, porém, isso funciona bem. Você esperaria que ele funcionasse bem em sistemas Unix certificados também.
O bashshell possui um operador dedicado para isso:
in=AbCdE
out=${in~~}
Com zsh -o extendedglob:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ(e2 b4 a0) é Ⴠ(e1 83 80); ambos i(69) e ı(c4 b1) têm I(49) em maiúsculas (exceto nas localidades turcas onde ise torna İ). A razão pela qual ele não funciona com o GNU tré que o GNU trtrabalha com bytes e não com caracteres.
[:lower:]ou [:upper:](portanto, a primeira é ignorada). Mesmo em francês, œ -> Œestá c5 93 -> c5 92em UTF-8 e bd -> bcem iso8859-15.
Embora isso tenha as mesmas limitações já mencionadas como a trsolução oferecida por Stéphane Chazelas, é outra maneira de fazê-lo:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
Eu despejo stderrpara /dev/nulllá porque ddtambém fornece estatísticas de todas as suas operações no 2descritor de arquivo. Isso pode ser útil dependendo do que você está fazendo, mas não foi para esta demonstração. Todas as outras coisas com as quais você pode fazer ddainda se aplicam, por exemplo:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBcnão é convertido em AbC).
Se seu objetivo principal é converter um arquivo de classe baixa para classe alta, por que você não usa tre STDOUTpara converter seu arquivo:
$cat FILENAME | tr a-z A-Z > FILENAME2
Onde FILENAMEestá o seu arquivo original. Onde FILENAME2está o seu arquivo de saída convertido.
épor exemplo (pelo menos no meu arquivo).
usando awk:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txtcomeçaria truncando o arquivo
ruby tem um método de string para isso, uso semelhante na linha de comando, como perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Veja também Ruby-doc Encoding
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Mantenha simples coisa simples. O filtro projetado para traduzir caracteres é tr.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
trseria mais adequado do quesed.