Troca de caixa em Bash (método alternativo)

upperlower1_abertura

Algo para complementar a manipulação de strings em Bash com uma última dica sobre o assunto de conversão de caixa dos caracteres — aquela coisa de se mudar entre maiúsculas e minúsculas. Minha primeira sugestão foi usar o comando declare para alterar os atributos da string e deixar o Bash cuidando disto sozinho e até propor duas funções¹ para simplificar a tarefa. Porém, como sempre, existe outro modo para fazer a mesma coisa. 🙂

(¹) Mais precisamente as funções toupper() e tolower(), análogas às suas homônimas em AWK.

Assim como é possível utilizar as expansões do Bash para cortar — os #, * e : — ou substituição — o / — em uma string também é possível utilizá-las para trocar a caixa de caracteres. Neste caso os caracteres utilizados são o circunflexo — ^ — e a vírgula — , — que, respectivamente, fazem a conversão dos caracteres da string para maiúsculas e para minúsculas.

Seu funcionamento difere um pouco do modo como operam os parâmetros “-u” e “-l” do comando declare pois é possível com eles realizar a substituição de somente o primeiro caractere da string, se aplicável², ou em toda ela.

De caixa baixa para alta.

$ NOME="giovanni"
$ echo ${NOME^} ${NOME^^}
Giovanni GIOVANNI

Como também de alta para baixa.

$ SYSTEM="LINUX"
$ echo ${SYSTEM,} ${SYSTEM,,}
lINUX linux

Usando um acento circunflexo ou vírgula somente o primeiro caractere da string será expandido, independente de ter ali um caractere a se converter. Utilizando dois caracteres a expansão será realizada em toda a string.

Mas há um diferencial.

$ A=$( uname -a )
$ echo ${A}
Linux athena 4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 
2017 x86_64 x86_64 x86_64 GNU/Linux
$ echo ${A^^[aeiou]}
LInUx AthEnA 4.4.0-79-gEnErIc #100-UbUntU SMP WEd MAy 17 19:58:14 UTC 
2017 x86_64 x86_64 x86_64 GNU/LInUx

É possível indicar quais caracteres serão substituídos usando a mesma expansão entre colchetes que o Bash utiliza em nomes de arquivos montando uma lista, algo como <tt>[aeiou]</tt>, ou mesmo uma faixa, <tt>[a-m]</tt> para metade do alfabeto, de caracteres.

E para terminar…

$ echo ${A,,[!AEIOU]}
linux athena 4.4.0-81-generic #104-Ubuntu smp wed jun 14 08:17:06 Utc 
2017 x86_64 x86_64 x86_64 gnU/linux

É possível negar a lista e assim fazer o Bash executar justamente o contrário do que você está pedindo! 🙂

(²) Mais precisamente se no primeiro caractere não existir uma letra para tornar maiúscula, ou minúscula, nada será feito, o Bash não procurará pela primeira ocorrência válida.

Anúncios

2 comentários sobre “Troca de caixa em Bash (método alternativo)

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s