Manipulação de strings
Esta aula aborda técnicas essenciais de manipulação de strings em Shell Script (Bash), incluindo como obter o comprimento de uma string, extrair substrings, converter entre maiúsculas e minúsculas, e realizar substituições de padrões. Através de exemplos práticos e exercícios, o aluno aprenderá a manipular textos de forma eficiente em scripts.
Nesta aula, vamos explorar as principais técnicas de manipulação de strings em Shell Script (Bash). Strings são fundamentais em qualquer script, seja para processar entradas do usuário, ler arquivos ou gerar saídas formatadas. Dominar essas operações permite escrever scripts mais robustos e eficientes.
O Bash oferece uma série de expansões de parâmetros e comandos que facilitam o trabalho com strings. Veremos como obter o comprimento, extrair partes específicas, alterar a capitalização e substituir trechos, tudo isso sem depender de ferramentas externas como sed ou awk (embora elas também sejam úteis).
Comprimento
Para obter o comprimento de uma string em Bash, utilizamos a expansão de parâmetro ${#variavel}. Isso retorna o número de caracteres da string armazenada na variável.
É importante notar que isso conta caracteres, não bytes. Em sistemas com UTF-8, caracteres acentuados podem ocupar mais de um byte, mas o Bash conta corretamente o número de caracteres (desde que o locale esteja configurado adequadamente).
#!/bin/bash
frase="Olá, mundo!"
echo "A frase tem ${#frase} caracteres."
# Saída: A frase tem 12 caracteres.Você também pode usar o comando expr para o mesmo fim, mas a expansão é mais eficiente e integrada ao shell.
frase="Shell Script"
comprimento=$(expr length "$frase")
echo "Comprimento: $comprimento" # Comprimento: 12Substring
Extrair uma substring é uma operação comum. O Bash fornece a sintaxe ${variavel:posicao:comprimento} para isso. A posição é baseada em zero, e o comprimento é opcional; se omitido, retorna até o final da string.
Também é possível usar índices negativos para contar a partir do final, mas isso requer um espaço antes do - para evitar ambiguidade com a expansão de parâmetros.
texto="Programação em Shell"
# Extrair a partir da posição 5, 3 caracteres
echo "${texto:5:3}" # 'ama'
# Extrair da posição 5 até o final
echo "${texto:5}" # 'amação em Shell'
# Extrair os últimos 5 caracteres
echo "${texto: -5}" # 'Shell'Lembre-se de que a posição é contada a partir de 0. Se a posição for maior que o comprimento da string, o resultado será uma string vazia.
Maiúsculas/minúsculas
Converter strings para maiúsculas ou minúsculas é útil para padronizar entradas. O Bash (versão 4.0+) oferece operadores de expansão: ${variavel^^} para maiúsculas e ${variavel,,} para minúsculas.
Esses operadores são rápidos e não requerem subprocessos. Eles também podem ser usados para converter apenas o primeiro caractere: ${variavel^} e ${variavel,}.
nome="joão silva"
echo "${nome^^}" # JOÃO SILVA
echo "${nome,,}" # joão silva
echo "${nome^}" # João silva
echo "${nome,}" # joão silva (primeiro caractere minúsculo, já está)
# Para converter apenas a primeira letra de cada palavra, é mais complexo; pode-se usar sed ou awk.Se precisar de compatibilidade com versões antigas do Bash, use tr ou awk.
Substituição
Substituir partes de uma string é essencial para manipulação de texto. O Bash oferece ${variavel/padrao/substituicao} para substituir a primeira ocorrência e ${variavel//padrao/substituicao} para substituir todas as ocorrências.
O padrão pode ser um texto literal ou um padrão glob (como *, ?, [abc]). Se a substituição for omitida, o padrão é removido.
frase="O rato roeu a roupa do rei de Roma"
# Substituir primeira ocorrência de 'ro' por 'RO'
echo "${frase/ro/RO}" # O Rato roeu a roupa do rei de Roma
# Substituir todas as ocorrências de 'ro' por 'RO'
echo "${frase//ro/RO}" # O RatO ROeu a ROUpa dO Rei de ROma
# Remover a primeira ocorrência de 'ro'
echo "${frase/ro}" # O rato roeu a roupa do rei de Roma (remove 'ro' de 'rato'? Na verdade remove 'ro' de 'rato'? Vamos ver: 'rato' vira 'rato'? Não, remove 'ro' de 'rato'? O padrão 'ro' aparece em 'rato'? Sim, 'rato' contém 'ro'? Não, 'rato' é r-a-t-o, não tem 'ro'. A primeira ocorrência de 'ro' está em 'roeu'? Vamos testar: frase="O rato roeu..." a primeira ocorrência de 'ro' é em 'roeu', então resultado: "O rato roeu..."? Não, substituir por vazio remove 'ro' de 'roeu', ficando 'eu'? Vou corrigir no exemplo.
# Exemplo correto:
echo "${frase/ro/}" # Remove a primeira ocorrência de 'ro', resultando em "O rato eu a roupa do rei de Roma"? Na verdade, 'roeu' vira 'eu'? Sim.
Para substituições mais complexas, como usar expressões regulares, é recomendado usar sed ou perl. O Bash não suporta regex diretamente nessa expansão.
Boas práticas
- Sempre cite as variáveis entre aspas duplas ao usar expansões para evitar problemas com espaços e caracteres especiais.
- Prefira as expansões do Bash em vez de comandos externos para operações simples, pois são mais rápidas.
- Teste seus scripts com strings vazias e com caracteres Unicode para garantir robustez.
- Documente o código com comentários explicando o que cada manipulação faz.
Observações finais
Essas técnicas são amplamente utilizadas em scripts de automação, processamento de logs e manipulação de arquivos. Pratique combinando-as para resolver problemas do dia a dia. Lembre-se de que o Bash é uma ferramenta poderosa, mas para operações mais complexas, considere usar outras linguagens como Python ou Perl.
Referências
- Bash Reference Manual: Shell Parameter Expansion
- Advanced Bash-Scripting Guide: String Manipulation
- Bash cheatsheet
- Bash Manual Index
- Bash Hackers Wiki: Parameter Expansion
Exercícios
- Escreva um script que leia uma string do usuário e exiba seu comprimento.✓ Resposta:
#!/bin/bash read -p "Digite uma string: " str echo "Comprimento: ${#str}" - Crie um script que extraia e imprima os três primeiros caracteres de uma variável
texto.✓ Resposta:texto="Aprendendo Bash" echo "${texto:0:3}" # Apr - Converta uma string para maiúsculas e depois para minúsculas, exibindo ambas.✓ Resposta:
str="Olá Mundo" echo "Maiúsculas: ${str^^}" echo "Minúsculas: ${str,,}" - Dada a string
"O rato roeu a roupa", substitua todas as ocorrências de "ro" por "RO" e exiba o resultado.✓ Resposta:frase="O rato roeu a roupa" echo "${frase//ro/RO}" # O RatO ROeu a ROUpa - Escreva um script que remova a primeira ocorrência da letra "a" de uma string fornecida pelo usuário.✓ Resposta:
#!/bin/bash read -p "Digite uma string: " str echo "${str/a}"