Correspondência de Regex em Bash

ShellBeginner
Pratique Agora

Introdução

Este tutorial apresenta as expressões regulares (regex) no Bash. Regex é uma ferramenta poderosa para encontrar padrões dentro de texto. Ao aprender regex, você aprimorará significativamente suas habilidades de scripting em shell, permitindo que processe texto, extraia dados e automatize tarefas de forma mais eficaz. Este tutorial foi projetado para iniciantes, portanto, nenhuma experiência prévia com regex é necessária. Começaremos com o básico e gradualmente construiremos seu conhecimento.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível intermediário com uma taxa de conclusão de 54%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Compreendendo Regex Básico e Correspondência

Vamos começar com os conceitos fundamentais das expressões regulares. Uma expressão regular é uma sequência de caracteres que define um padrão de busca. Pense nisso como uma maneira muito poderosa de pesquisar texto.

Aqui estão os blocos de construção básicos:

  • Caracteres Literais: A maioria dos caracteres simplesmente correspondem a si mesmos. Por exemplo, a regex abc corresponderá exatamente à string "abc".
  • Metacaracteres: São caracteres especiais que têm um significado específico em regex. Vamos analisar alguns dos principais:
    • . (ponto): Corresponde a qualquer caractere único (exceto uma nova linha). Portanto, a.c corresponderia a "abc", "axc", "a1c" e assim por diante.
    • * (asterisco): Corresponde ao caractere precedente zero ou mais vezes. ab*c corresponderia a "ac", "abc", "abbc", "abbbc", etc.
    • ^ (acento circunflexo): Corresponde ao início de uma linha. ^hello corresponderia a uma linha que começa com "hello".
    • $ (sinal de dólar): Corresponde ao final de uma linha. world$ corresponderia a uma linha que termina com "world".
    • [] (colchetes): Define uma classe de caracteres. Corresponde a qualquer um dos caracteres dentro dos colchetes. [abc] corresponderia a "a", "b" ou "c". [0-9] corresponde a qualquer dígito único.

Agora, vamos criar um script Bash para testar nossa compreensão. Crie um arquivo chamado regex_test.sh usando o comando touch:

cd ~/project
touch regex_test.sh

Em seguida, abra regex_test.sh com um editor de texto (como nano ou vim) e adicione o seguinte código:

#!/bin/bash

string="Hello World"
if [[ "$string" =~ ^Hello ]]; then
  echo "The string starts with Hello"
else
  echo "The string does not start with Hello"
fi

Salve o arquivo e torne-o executável:

chmod +x regex_test.sh

Finalmente, execute o script:

./regex_test.sh
Regex and Matching

A saída deve indicar que a string começa com "Hello".

Trabalhando com Conjuntos de Caracteres em um Script

Conjuntos de caracteres, definidos usando colchetes [], permitem que você corresponda a um caractere de um grupo específico. Isso é muito útil para criar padrões mais flexíveis.

  • Intervalos de Caracteres: Dentro de [], você pode usar um hífen (-) para especificar um intervalo. [a-z] corresponde a qualquer letra minúscula, [A-Z] corresponde a qualquer letra maiúscula e [0-9] corresponde a qualquer dígito. Você pode combiná-los: [a-zA-Z0-9] corresponde a qualquer caractere alfanumérico.
  • Negação: Se você colocar um ^ como o primeiro caractere dentro de [], ele nega a classe. [^0-9] corresponde a qualquer caractere que não seja um dígito.

Vamos modificar nosso script regex_test.sh para usar conjuntos de caracteres. Abra regex_test.sh com um editor de texto e substitua seu conteúdo pelo seguinte:

#!/bin/bash

string="cat"
if [[ "$string" =~ c[a-z]t ]]; then
  echo "Match found!"
else
  echo "No match."
fi

Salve o arquivo e execute-o:

./regex_test.sh

A saída deve indicar "Match found!". Isso ocorre porque c[a-z]t corresponde a qualquer string de três letras começando com 'c' e terminando com 't', onde o caractere do meio é uma letra minúscula.

Usando Quantificadores para Repetir Padrões em um Script

Quantificadores controlam quantas vezes um caractere ou grupo deve ser repetido. Isso adiciona um poder significativo aos seus padrões de regex.

  • + (mais): Corresponde ao caractere precedente uma ou mais vezes. ab+c corresponde a "abc", "abbc", "abbbc", etc., mas não a "ac".
  • ? (ponto de interrogação): Corresponde ao caractere precedente zero ou uma vez (ou seja, torna o caractere precedente opcional). ab?c corresponde a "ac" e "abc", mas não a "abbc".
  • * (asterisco): Corresponde ao caractere precedente zero ou mais vezes. Vimos isso anteriormente.
  • {n}: Corresponde ao caractere precedente exatamente n vezes. a{3} corresponde a "aaa".
  • {n,}: Corresponde ao caractere precedente n ou mais vezes. a{2,} corresponde a "aa", "aaa", "aaaa", etc.
  • {n,m}: Corresponde ao caractere precedente entre n e m vezes (inclusive). a{1,3} corresponde a "a", "aa" ou "aaa".

Vamos modificar nosso script regex_test.sh para usar quantificadores. Abra regex_test.sh com um editor de texto e substitua seu conteúdo pelo seguinte:

#!/bin/bash

string="abbbc"
if [[ "$string" =~ ab+c ]]; then
  echo "Match found!"
else
  echo "No match."
fi

Salve o arquivo e execute-o:

./regex_test.sh

A saída deve indicar "Match found!". Isso ocorre porque ab+c corresponde a uma string começando com 'a', seguida por um ou mais 'b's, e terminando com 'c'.

Extraindo Dados com Grupos de Captura em um Script

Parênteses () são usados para agrupar partes de uma regex. Isso é útil para aplicar quantificadores a múltiplos caracteres e para capturar texto correspondente.

Quando você usa parênteses, o Bash armazena o texto correspondente por aquela parte da regex em um array especial chamado BASH_REMATCH. BASH_REMATCH[0] contém a string inteira correspondente, BASH_REMATCH[1] contém o texto correspondente pelo primeiro grupo, BASH_REMATCH[2] o segundo, e assim por diante.

Vamos modificar nosso script regex_test.sh para extrair dados usando grupos de captura. Abra regex_test.sh com um editor de texto e substitua seu conteúdo pelo seguinte:

#!/bin/bash

string="apple123"
if [[ "$string" =~ ^([a-z]+)([0-9]+)$ ]]; then
  fruit="${BASH_REMATCH[1]}"
  number="${BASH_REMATCH[2]}"
  echo "Fruit: $fruit"
else
  echo "No match."
fi

Salve o arquivo e execute-o:

./regex_test.sh

A saída deve incluir "Fruit: apple". Este script extrai o nome da fruta da string usando grupos de captura.

Substituindo Texto com sed em um Script

Vamos criar um novo script chamado sed_test.sh para praticar o uso de sed.

cd ~/project
touch sed_test.sh
chmod +x sed_test.sh

Abra sed_test.sh com um editor de texto e adicione o seguinte:

#!/bin/bash

string="apple123"
echo "$string" | sed 's/[0-9]/X/g'

Salve o arquivo e execute-o:

./sed_test.sh

A saída deve ser: appleXXX. Este script usa sed para substituir todos os dígitos na string pela letra "X".

Resumo

Este tutorial apresentou a você as expressões regulares (regex) em Bash. Você aprendeu sobre conceitos básicos de regex, classes de caracteres, quantificadores, agrupamento, captura e como usar regex com sed. Ao escrever e executar scripts Bash, você ganhou experiência prática com essas ferramentas poderosas. Lembre-se de praticar e experimentar diferentes padrões de regex para solidificar sua compreensão.