Bash script – Manipulação de STRINGS

Linguagem BASH.

Neste artigo vou tratar da manipulação de strings que é um tema importante em qualquer linguagem de programação.

Em informática uma “string” é um conjunto de caracteres que são guardados numa variável.

Em determinadas situações necessitamos manipular estas strings de diversas formas para que possamos tratar o seu conteúdo.

Neste artigo vou explicar como podemos obter o número de caracteres de uma determinada string, explicar como podemos obter uma parte da string e também como podemos substituir parte de uma string com outros valores.

Em BASH podemos utilizar a seguinte sintaxe para obter o conteúdo de uma variável, para além da forma mais comum que expliquei no artigo sobre variáveis.

${nome da variável}

Como podemos ver neste caso o nome da variável fica entre chavetas, esta sintaxe é válida mas normalmente é utilizada quando pretendemos manipular a string de alguma forma.

 

Comprimento de uma string

Existe muitos casos onde necessitamos de saber o número de caracteres que uma string ocupa, o seu comprimento. Para que desta forma possamos comparar variáveis a fim de saber se o resultado de algum processo foi o esperado ou qualquer outra situação.

 

A sintaxe que utilizamos para contar o número de caracteres de uma string é o seguinte:

${#nome da variável}

Como podemos ver neste caso a variável é procedida pelo caractere “#” cardinal. O carácter cardinal antes do nome da variável permite que seja retornado o número de caracteres de uma string em vez do seu conteúdo.

No  seguinte script exemplifico a utilização deste conceito.

#!/bin/bash

# Esta variável guarda uma determinada frase.
variavel1="Uma frase de exemplo!"

# Esta variável guarda um caminho no sistema de ficheiros
variavel2="/home/miguel"

# Esta variável guarda um número que em bash é apenas representativo,
# são os caracteres numéricos.
variavel3=888

# Escrever o número de caracteres de cada uma desta strings.
echo "O número de caracteres da variavel1 é: ${#variavel1}"
echo "O número de caracteres da variavel2 é: ${#variavel2}"
echo "O número de caracteres da variavel3 é: ${#variavel3}"

Executamos o script desta forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_1.sh 
O número de caracteres da variavel1 é:  21
O número de caracteres da variavel2 é:  12
O número de caracteres da variavel3 é:  3

 

Obter parte de uma string

Existe uma necessidade de obter uma parte de uma string no desenvolvimento de scripts. Vou demonstrar com o seguinte exemplo como podemos obter parte de uma string.

A sintaxe para obtermos uma parte de uma string é a seguinte:

${nome da variável:posição:comprimento}

Onde o “nome da variável” é a variável que queremos trabalhar, a “posição” é a posição a partir de onde queremos obter os caracteres na variável e “comprimento” que é o número de caracteres que queremos obter da variável.

O seguinte script obtém o número  de identificação e o código postal de uma frase:

#!/bin/bash

# Esta variável guarda uma frase com um número de identificação
# e o código postal de alguém.
variavel1="O número de identificação é 255555552 e o código postal é 2710-501"

# Obter o número de identificação
echo "O número de identificação é :${variavel1:28:9}"

# Obter o código postal
echo "O código postal é: ${variavel1:58}"

Como podemos ver no script não utilizo o comprimento para obter o código postal, desta forma é retornado todos os caracteres a partir da posição escolhida.

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_2.sh 
O número de identificação é :255555552
O código postal é: 2710-501

Remover parte de uma string por separador

O Bash permite remover uma parte do conteúdo de uma variável que contenha um determinado separador. Este separador pode ser qualquer caractere ou conjunto de caracteres bem como uma expressão. Nos exemplos irei utilizar dois pontos como separador mas pode ser qualquer um ou vários.

O BASH tem duas formas de remover parte do conteúdo, uma é designada por curta e outra por longa.

Forma curta

Na forma curta podemos remover parte do conteúdo de duas formas, do inicio para o fim e do fim para a inicio.

A seguinte sintaxe é usada para remover o conteúdo do inicio para o fim.

${nome da variável#separador}

A seguinte sintaxe é usada para remover o conteúdo do fim para a inicio.

${nome da variável%separador}

Como podemos ver é utilizado o caractere “#” cardinal entre a variável e o separador quando queremos remover conteúdo do inicio para o fim e o caractere “%” quando queremos remover conteúdo do fim para o inicio.

Neste exemplo vou demonstrar como podemos remover parte do conteúdo de uma variável que o seu conteúdo é separado por “:” dois pontos.

#! /bin/bash

# Esta variável guarda os dados de uma pessoa,
# nome, número da biblioteca, número de estudante
# e idade separados por dois pontos.
dados="miguel:43432434:234234:38"

# Remover o nome
# Apaga tudo a partir do inicio até encontrar o caractere ":"
# dois pontos.
echo "Remove o nome: ${dados#*:}"

# Remover a idade
# Apaga tudo a partir do fim até encontrar o caractere ":"
# dois pontos.
echo "Remove a idade: ${dados%:*}"

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_3.sh 
Remove o nome: 43432434:234234:38
Remove a idade: miguel:43432434:234234

Como podemos ver eu usei o  caractere “*” que é uma expressão que significa qualquer caractere e qualquer número de caracteres, portanto qualquer coisa.

Na primeira parte para remover o nome utilizei a expressão “*:” que significa qualquer coisa “*”  mais o sinal de dois pontos “:” isto é importante pois neste caso sei que o nome é miguel e podia utilizar “miguel:” como separador, mas se fosse outro nome já não funcionaria. Utilizando “*:” funciona com qualquer nome, com qualquer texto que termine em “:“. Portanto foi removido tudo até encontrar o sinal de “:” dois pontos, bem como o próprio sinal , do inicio para o fim.

Na segunda parte para remover a idade utilizei a expressão “:*” que significa qualquer coisa “*”  mais o sinal de dois pontos “:” mas neste caso é do fim para o inicio. Podia utilizar “:38“, mas só funcionaria com esta idade. Usando a expressão “:*” funciona com qualquer idade ou com qualquer texto no fim do conteúdo até ao sinal “:” dois pontos. Portando foi removida a idade bem como o próprio sinal de dois pontos.

Forma longa

Na forma longa podemos remover parte do conteúdo de duas formas, do inicio para o fim e do fim para a inicio.

A seguinte sintaxe é usada para remover o conteúdo do inicio para o fim.

${nome da variável##separador}

A seguinte sintaxe é usada para remover o conteúdo do fim para a inicio.

${nome da variável%%separador}

A diferença da forma curta para a forma longa é que na forma longa são removidas todas as ocorrências da expressão encontrada. Na forma longa só podemos utilizar expressões pois não fazia sentido se tivéssemos de saber todo o conteúdo que quiséssemos remover.

Neste exemplo vou demonstrar como podemos remover parte do conteúdo de uma variável que o seu conteúdo é separado por “:” dois pontos.

#! /bin/bash

# Esta variável guarda os dados de uma pessoa,
# nome, número da biblioteca, número de estudante
# e idade separados por dois pontos.
dados="miguel:43432434:234234:38"

# Obtém o nome da pessoa
# Remove tudo a partir do fim até encontrar o último
# caractere ":" dois pontos.
echo "O nome é :${dados%%:*}"

# Obtém a idade
# Remove tudo a partir do inicio até encontrar o último
# caractere ":" dois pontos.
echo "A idade é: ${dados##*:}"

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_4.sh 
O nome é :miguel
A idade é: 38

 

Substituição de conteúdo

É possível substituir partes do conteúdo de uma variável por outro conteúdo. Nesta parte do artigo vou demonstrar como fazê-lo. A substituição funciona procurando algum conteúdo, expressão, caractere ou conjunto de caracteres no conteúdo de uma variável e se achar substituir por outro conteúdo.

Existem várias formas de substituir o conteúdo de uma variável. Uma forma substitui apenas uma ocorrência encontrada, outra forma substitui todas as ocorrências encontradas, outra substitui no inicio do conteúdo e outra no final do conteúdo.

 

Substituir uma ocorrência

Para substituirmos algum conteúdo do conteúdo de uma variável utilizamos a seguinte sintaxe.

${nome da variável/expressão a achar/substituição}

Para exemplificar vejam o seguinte script:

#! /bin/bash

# Esta variável guarda uma simples frase
# que será utilizada para demonstrar a substituição
# de texto.
variavel1="O Miguel gosta de animais."

# Escreve a frase com o nome subsistido
# através Miguel.
echo ${variavel1/Miguel/"João"}
echo ${variavel1/Miguel/"Marco"}
echo ${variavel1/Miguel/"Daniel"}

A finalidade é encontrar uma determinada expressão e substituir por qualquer coisa. Neste exemplo é procurado por “miguel” e substituído por vários nomes.

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_5.sh 
O João gosta de animais.
O Marco gosta de animais.
O Daniel gosta de animais.

 

Substituir todas as ocorrências

Para substituir todas as ocorrências  de uma determina expressão por qualquer texto é basicamente igual a substituir uma ocorrência. A única diferença é que o BASH não para de procurar na primeira ocorrência encontrada e continua procurando pela expressão até ao final do conteúdo da variável.

Para substituirmos todas as ocorrências do conteúdo de uma variável utilizamos a seguinte sintaxe:

${nome da variável//expressão a achar/substituição}

Para exemplificar vejam o seguinte script:

#! /bin/bash

# Esta variável guarda uma simples frase
# que será utilizada para demonstrar a substituição
# de texto.
variavel1="O Miguel gosta de animais. O animal preferido do Miguel é o gato."

# Escreve a frase com o nome subsistido.
echo ${variavel1//Miguel/"João"}
echo ${variavel1//Miguel/"Marco"}
echo ${variavel1//Miguel/"Daniel"}

A finalidade é encontrar uma determinada expressão e substituir por qualquer coisa. Neste exemplo é procurado por “Miguel” e substituído por vários nomes, mas desta vez substitui todas as ocorrências.

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_6.sh 
O João gosta de animais. O animal preferido do João é o gato.
O Marco gosta de animais. O animal preferido do Marco é o gato.
O Daniel gosta de animais. O animal preferido do Daniel é o gato.

 

Substituir no início do conteúdo

Para substituirmos no inicio do conteúdo de uma variável utilizamos a seguinte sintaxe:

${nome da variável/#expressão a achar/substituição}

Como podemos ver neste caso utilizamos o caractere “#” antes da expressão ou texto que queremos encontrar.

Repare no seguinte script que substitui o número de carros de uma frase:

#! /bin/bash

# Esta variável guarda uma simples frase
# que será utilizada para demonstrar a substituição
# de texto no inicio da frase que neste caso é o
# número de carros.
variavel1="5 carros pretos."

# Escreve a frase com um número diferente de carros.
# Substitui o 5 por outro número qualquer.
echo ${variavel1/#5/2}
echo ${variavel1/#5/7}
echo ${variavel1/#5/500}

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_7.sh 
2 carros pretos.
7 carros pretos.
500 carros pretos.

Como podemos ver o 5 da frase é substituído por outro número na frase.

Substituir no final do conteúdo

Para substituirmos no final do conteúdo de uma variável utilizamos a seguinte sintaxe.

${nome da variável/%expressão a achar/substituição}

Como podemos ver neste caso utilizamos o caractere “%” antes da expressão ou texto que queremos encontrar.

Repare no seguinte script que substitui o número de carros de uma frase:

#! /bin/bash

# Esta variável guarda uma simples frase
# que será utilizada para demonstrar a substituição
# de texto no final da frase que neste caso é o
# número de carros.
variavel1="Carros vermelhos: 5"

# Escreve a frase com um número diferente de carros.
# Substitui o 5 por outro número qualquer.
echo ${variavel1/%5/3}
echo ${variavel1/%5/8}
echo ${variavel1/%5/200}

Executamos o script da seguinte forma:

miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_8.sh 
Carros vermelhos: 3
Carros vermelhos: 8
Carros vermelhos: 200

 

Conclusão

Trabalhar com STRINGS é importante na construção de scripts. Em BASH tudo é uma string, mesmo os números são representativos, quando vemos o número 8 na verdade é o caractere que representa o número 8.

Perceber como tratar o texto de várias formas é importante e é muito utilizado na vida real na construção de scripts.

Existem muitas outras formas de trabalhar texto com comandos externos como awk, sed entre muitos outros. Este artigo cobre apenas as formas internas que o próprio BASH tem, mais para a frente iremos então tratar deste assunto com comandos externos.

Para experimentar os scripts descarregue-os e guarde dentro de uma pasta dentro da sua pasta pessoal. Terá que lhes dar permissão de execução a todos eles. Veja este exemplo de como fazer, terá que ajustar para o seu utilizador e a pasta onde guardou os scripts.

miguel@LUA:~$ cd Scripts/bash
miguel@LUA:~/Scripts/bash$ chmod +x *
miguel@LUA:~/Scripts/bash$ ./var_manipulação_ex_1.sh

 

Duvidas e ideias que queiram discutir sobre BASH podem ser discutidas aqui.

Partilhem, comentem e experimentem!

Artigos Relacionados:

Deixe uma resposta