Comando para converter uma string de maiúsculas para minúscula?

44

Qual é o comando Bash que eu posso usar para converter uma string de letras maiúsculas para minúsculas e vice-versa?

Obrigado.

    
por rɑːdʒɑ 28.11.2013 / 14:03

7 respostas

55

Se a string já estiver armazenada em uma variável, você pode usar a expansão de parâmetro de bash , especificamente ${parameter,,pattern} (disponível desde bash 4.0), em que parameter é o nome de sua variável e pattern é omitido :

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Observe que isso não altera o valor da variável, apenas a saída. Para mudar a variável você tem que atribuir o novo valor:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

A conversão de letras maiúsculas funciona com ${parameter^^pattern} :

$ echo ${string^^}
HELLO, WORLD!

Isso também funciona com strings Unicode (pelo menos com as versões atuais do bash, provavelmente precisa pelo menos do bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Se você estiver usando zsh , você pode usar Flags de Expansão de Parâmetros ( ${(FLAGS)NAME} ; disponível desde o zsh 2.5) para obter os mesmos resultados. A sintaxe bash não funciona em zsh 1) . O sinalizador para letras minúsculas é L ; para letras maiúsculas, é U :

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Isso também funciona com strings Unicode (pelo menos desde o zsh 5.0; eu não tentei com versões anteriores):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ

1) Embora, vendo que zsh tinha isso por muito mais tempo, provavelmente deveria ser: "a sintaxe zsh não funciona em bash .

    
por Adaephon 28.11.2013 / 14:18
38

Existem muito poucos métodos que funcionam corretamente com o Unicode:

GNU sed 4.2.2 funciona :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 declare não funciona:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą
A expansão de parâmetro do

bash 4.2.45 não funciona:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declare e expansão de parâmetro work :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

O GNU tr 8.20 não funciona não :

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (default awk no Ubuntu 13.10) não funciona não :

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk funciona :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc () não não funciona:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

O Python 2 sem dicas de Unicode não funciona e :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 quando instruído a lidar com o Unicode funciona :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 funciona :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
    
por Michał Šrajer 29.11.2013 / 16:37
20

Eu usaria o comando bash inner typeset ou declare para definir uma variável minúscula.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Os caracteres são reduzidos quando o valor é definido, não quando você compõe a variável. Por isso, é melhor compor no início do script. Para maiúsculas, você pode criar um tip -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Isto não é específico para o bash shell, que funciona também no ksh, talvez na definição do shell POSIX.

EDITAR: Muitas pessoas gentilmente me apontaram o fato de que o typeset agora é considerado obsoleto no bash e substituído por declare . Ambos os comandos são equivalentes.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See 'help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

Eu mesmo ainda uso a sintaxe do typeset enquanto trabalho em ambiente heterogêneo, então não tenho que reescrever meus scripts.

    
por Emmanuel 28.11.2013 / 16:25
16

Você pode fazer isso com o comando tr .

No terminal ( Ctrl + Alt + T )

Este comando:

echo 'String here' | tr "[:lower:]" "[:upper:]"

converterá letras minúsculas em maiúsculas.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

irá converter maiúsculas para minúsculas.

Exemplo:

Ocréditovaipara cybercity

    
por Ten-Coin 28.11.2013 / 14:12
9

Você pode canalizar coisas através de sed também:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

E \L terá o efeito oposto:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
    
por Oli 28.11.2013 / 14:26
1

Não é uma solução pura, mas você pode canalizar suas strings através de perl (como Oli fez com sed ):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

E \L terá o efeito oposto:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
    
por Sylvain Pineau 22.09.2014 / 14:25
-1

Use este comando simples Para maiúsculas e minúsculas Onde 'f' é o nome do arquivo em que você deseja fazer a conversão.

tr "A-Z" "a-z" < f

Para maiúsculas e minúsculas

tr "a-z" "A-Z" < f
    
por jack 14.10.2014 / 02:25

Tags