Converte todo o texto de maiúsculas para minúsculas e vice-versa?

16

Minha pergunta é como converter todo o texto de maiúsculas para minúsculas e vice-versa? Isso é para mudar os casos de todas as letras. Isso tem que ser feito com uma substituição sed de alguma forma.

    
por MEZesUBI 08.06.2014 / 20:57

7 respostas

20

Aqui está um caminho reto em sed :

$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy

ou de forma mais curta com o GNU sed , trabalhando com qualquer caractere para o qual existe uma conversão de letras minúsculas < - > em sua localidade:

$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\L/g'
QwErTy

se você puder usar outras ferramentas, como:

perl (limitado a letras ASCII):

$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy

perl (mais geralmente):

$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
    
por 08.06.2014 / 21:28
16

POSIXly, isso não pode ser feito com sed , exceto fornecendo o conjunto completo de letras que você deseja transliterar, conforme @cuonglm mostrou .

Poderia ser feito com tr , e é para isso que tr (transliterado):

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

No entanto, no Linux, tem limitações. Das implementações de 3 tr comumente encontradas em sistemas baseados em Linux:

  • com o GNU tr , que funciona apenas para conjuntos de caracteres de byte único. Por exemplo, em Stéphane Chazelas em locales UTF-8, isso dá sTéPHANE cHAZELAS em vez de sTÉPHANE cHAZELAS . Essa é uma limitação conhecida do GNU tr .
  • com tr do toolchest da herança, isso não funciona (você obtém stéphane chazelas ).
  • Esse não é o tipo de coisa que o busybox tr fará.

No FreeBSD isso funciona bem. Você esperaria que funcionasse bem em sistemas Unix certificados também.

O shell bash tem um operador dedicado para isso:

in=AbCdE
out=${in~~}

com zsh -o extendedglob :

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
    
por 08.06.2014 / 23:19
2

Embora isso tenha as mesmas limitações já mencionadas como a solução tr oferecida por Stéphane Chazelas, é outra maneira de fazê-lo:

{   echo QWERTYqwerty | dd conv=lcase
    echo QWERTYqwerty | dd conv=ucase 
} 2>/dev/null

OUTPUT

qwertyqwerty
QWERTYQWERTY

Eu despejo stderr em /dev/null lá porque dd também fornece estatísticas de todas as suas operações no descritor de arquivo 2 . Isso pode ser útil dependendo do que você está fazendo, mas não foi para essa demonstração. Todas as outras coisas que você pode fazer com dd ainda se aplicam, por exemplo:

echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null

OUTPUT:

QWERTY
QWERTY
    
por 09.06.2014 / 05:52
1

usando awk :

awk '{print tolower($0)}' file.txt | tee file.txt
    
por 05.11.2014 / 06:23
1

Se o seu objetivo principal é converter um arquivo de lowerclass para upperclass, Por que você não usa tr e STDOUT para converter seu arquivo:

$cat FILENAME | tr a-z A-Z > FILENAME2

Onde FILENAME é seu arquivo original. Onde FILENAME2 é seu arquivo de saída convertido.

    
por 25.05.2018 / 14:44
0

ruby tem um método de string para isso, uso semelhante da linha de comando como perl

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

Veja também codificação ruby-doc

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ
    
por 28.02.2018 / 10:25
-1

Mantenha a coisa simples simples. O filtro projetado para traduzir caracteres é tr .

echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
    
por 22.09.2016 / 19:41

Tags