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'
ΑβΓ
sed
e 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, sed
exceto 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 tr
implementações comumente encontradas em sistemas baseados em Linux:
tr
, que funciona apenas para conjuntos de caracteres de byte único. Por exemplo, em Stéphane Chazelas
localidades UTF-8, isso fornece em sTéPHANE cHAZELAS
vez de sTÉPHANE cHAZELAS
. Essa é uma limitação conhecida do GNU tr
.tr
partir da caixa de ferramentas da herança, isso não funciona (você entende stéphane chazelas
).tr
fará.No FreeBSD, porém, isso funciona bem. Você esperaria que ele funcionasse bem em sistemas Unix certificados também.
O bash
shell 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 i
se torna İ
). A razão pela qual ele não funciona com o GNU tr
é que o GNU tr
trabalha com bytes e não com caracteres.
[:lower:]
ou [:upper:]
(portanto, a primeira é ignorada). Mesmo em francês, œ -> Œ
está c5 93 -> c5 92
em UTF-8 e bd -> bc
em iso8859-15.
Embora isso tenha as mesmas limitações já mencionadas como a tr
soluçã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 stderr
para /dev/null
lá porque dd
também fornece estatísticas de todas as suas operações no 2
descritor 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 dd
ainda se aplicam, por exemplo:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
não é convertido em AbC
).
Se seu objetivo principal é converter um arquivo de classe baixa para classe alta, por que você não usa tr
e STDOUT
para converter seu arquivo:
$cat FILENAME | tr a-z A-Z > FILENAME2
Onde FILENAME
está o seu arquivo original. Onde FILENAME2
está 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.txt
começ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:]
tr
seria mais adequado do quesed
.