Comando para converter uma sequência maiúscula em minúscula?

Respostas:

59

Se a string já estiver armazenada em uma variável, você poderá usar basha expansão de parâmetro, especifialmente ${parameter,,pattern}(disponível desde o bash 4.0), onde parameteré o nome da 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 alterar a variável, você deve atribuir o novo valor:

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

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

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

Isso funciona também com cadeias de caracteres Unicode (pelo menos nas versões atuais do bash, provavelmente precisa de pelo menos o 4.3):

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

Se você estiver usando zsh, poderá usar Sinalizadores de Expansão de Parâmetro ( ${(FLAGS)NAME}; disponível desde o zsh 2.5) para obter os mesmos resultados. A bashsintaxe não funciona em zsh 1) . A bandeira para minúsculas é L; para 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 cadeias de caracteres Unicode (pelo menos desde o zsh 5.0; não tentei com versões anteriores):

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



1) Embora, considerando que o zsh tenha isso por muito mais tempo, provavelmente deva ser: "a zshsintaxe não funcionabash .

Adaephon
fonte
3
A ${string,,}notação existe apenas para o bash versão 4+. Caso contrário, é necessária uma das outras soluções, como $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant
40

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

O 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 do parâmetro bash 4.2.45 não funciona:

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

bash 4.3.42 declaree trabalho de expansão de parâmetros :

$ 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:

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

O mawk (padrão do awk no Ubuntu 13.10) não funciona:

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

gawk works :

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

O Perl pure uc () não funciona:

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

O Python 2 sem nenhuma dica Unicode não funciona:

$ 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 obras Unicode :

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

O Python 3 funciona :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
Michał Šrajer
fonte
11
No Ubuntu 13.04, tenho gawkcomo o awk padrão (como mostrado em update-alternatives --display awk). Tem certeza de que mawké o padrão na 13.10?
kiri
seds desde 1990 apoiaram a \Uopção ;-). Não é um recurso específico do gnu-sed. Caso contrário, ótima resposta, tantas opções, tão pouco tempo ;-) Boa sorte a todos!
shellter 14/10
Além disso, haverá alguns problemas com o turco (pontilhado e sem pontos i), para obter mais informações nos seguintes links: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat
No seu exemplo, a bolsa ucnão funciona no Perl porque você precisa use Encodeou use utf8. Reescreva seu exemplo como echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'e ele funcionará. Veja também stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy
20

Eu usaria o comando bash typeset interno ou declare para definir uma variável em 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ê digita a variável. Portanto, é melhor digitar no início do script. Para maiúsculas, você pode digitar -u .

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

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

EDIT: 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 tipográfica enquanto trabalho em ambiente heterogêneo, portanto, não preciso reescrever meus scripts.

Emmanuel
fonte
2
+1 Incrível, eu nunca conheci esse! entre algumas informações extras: Eu procurei isso no manual e parece que typeseté considerado desprovido e substituído pordeclare
thom
11
@thom obrigado, parece que o bash começou a ter uma vida longe de suas "raízes Bourne shell" :)
Emmanuel
17

Você pode fazer isso com o trcomando

No terminal ( Ctrl+ Alt+ T)

Este comando:

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

irá converter em minúsculas para maiúsculas.

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

irá converter maiúsculas em minúsculas.

Exemplo:

insira a descrição da imagem aqui

O crédito vai para a cibercidade

rɑːdʒɑ
fonte
2
Se você não se importa com os locais, tr A-Z a-ztambém funcionará.
Nick Matteo
9

Você também pode canalizar as coisas sed:

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

E \Lterá o efeito oposto:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Oli
fonte
1

Não é uma solução pura para o bash, mas você pode passar as cordas perl(como Oli fez com sed):

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

E \Lterá o efeito oposto:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Sylvain Pineau
fonte
-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
jack
fonte
11
Conforme observado em um comentário em uma resposta mais antiga , isso não funcionará para alguns locais.
Muru