Expressões Regulares: BRE, ERE e grep

Expressões Regulares: BRE, ERE e grep

O Que Você Vai Conquistar

  • Explicar a diferença entre Expressões Regulares Básicas (BRE) e Estendidas (ERE)
  • Escrever padrões precisos usando âncoras, classes de caracteres e quantificadores
  • Usar regex adequadamente com grep / egrep / sed
  • Extrair e excluir linhas correspondentes a padrões específicos de logs
  • Parar de cometer o erro frequente no exame "barra invertida em BRE"

Este é o núcleo do objetivo 103.7 do LPIC-1 "Buscar em arquivos de texto usando expressões regulares". Regex é uma linguagem para descrever padrões de strings e é a base do grep / sed / awk.

Decidindo Entre BRE e ERE

Regex tem dialetos. O LPIC pergunta sobre dois tipos POSIX.

Tipo Comandos Tratamento de + ? { } ( ) |
Expressão Regular Básica BRE grep / sed Barra invertida necessária (\+ \{ \()
Expressão Regular Estendida ERE grep -E / egrep / sed -E Usados diretamente (+ { ()

A diferença "escrever \{3\} em grep mas {3} em grep -E" é frequente no exame. Sempre esteja ciente de qual dialeto você está escrevendo.

Referência de Metacaracteres

Metacaractere Significado Exemplo
. Qualquer caractere único a.c -> abc, axc
* 0 ou mais do precedente ab* -> a, ab, abb
^ Âncora de início de linha ^root
$ Âncora de fim de linha bash$
[ ] Classe de caracteres [0-9] um dígito
[^ ] Classe negada [^0-9] não dígito
\+ (ERE +) 1 ou mais do precedente a\+
\? (ERE ?) 0 ou 1 do precedente colou\?r
\{n,m\} (ERE {n,m}) Entre n e m vezes [0-9]\{1,3\}
| (OR / alternação) Corresponder a qualquer lado. BRE precisa da barra invertida, ERE não cat|dog

Passo a Passo

Passo 1: Fixar posição com âncoras

grep '^#' /etc/ssh/sshd_config
grep 'bash$' /etc/passwd
grep -x 'root' users.txt
#	$OpenBSD: sshd_config
#Port 22
root:x:0:0:root:/root:/bin/bash
root

^ é início de linha e $ é fim de linha, âncoras de largura zero. grep -x corresponde à linha inteira (equivalente a ^pattern$). Esta é a base da extração de linhas de comentário e busca por correspondência exata.

Passo 2: Especificar faixas com classes de caracteres

grep '[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log
grep '[[:space:]]' config.txt
192.168.1.10 - - [17/May/2026]
10.0.0.5 - - [17/May/2026]

[0-9] é um dígito e \{1,3\} é 1 a 3 repetições (BRE requer barras invertidas). [[:space:]] é uma classe de caracteres POSIX que corresponde a espaços em branco.

Passo 3: Usar BRE e ERE adequadamente

grep 'colou\?r' notes.txt
grep -E 'colou?r' notes.txt
grep -E 'error|warning|fatal' app.log
color theme
favourite colour
[ERROR] disk full
[WARNING] high load

Ao usar ? + | {} (), grep -E (ERE) é mais legível. Fazer o mesmo em BRE requer escaping com barra invertida e reduz a legibilidade.

Passo 4: Combinar extração e exclusão

grep -v '^#' /etc/fstab | grep -v '^$'
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log | sort -u
grep -ci 'timeout' app.log
UUID=xxxx / ext4 defaults 0 1
192.168.1.10
10.0.0.5
7

-v mostra linhas que não correspondem (remover comentários/linhas em branco), -o extrai apenas a correspondência, -c fornece contagens, -i ignora maiúsculas/minúsculas. Frequentemente usado para extrair linhas efetivas de arquivos de configuração.

Passo 5: Substituir com regex no sed

echo "2026-05-17" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
sed -n '/^ERROR/p' app.log
17/05/2026
ERROR connection refused

sed -E é o modo ERE. \1 \2 são retrorreferências que reutilizam grupos capturados com ( ) no lado da substituição. Usado para conversão de formato de data e similares.

Por Que BRE Precisa de Barras Invertidas

BRE historicamente preserva a sintaxe antiga do grep / ed, tratando + ? { ( | como "sem significado especial (literal)". Para usá-los como quantificadores, grupos ou OR, você deve marcar "este é um metacaractere" com uma barra invertida. ERE remove essa sobrecarga tratando caracteres especiais como metacaracteres desde o início. grep -E / egrep habilitam ERE.

Sem entender essa diferença de design, você não consegue explicar "grep 'a+' não corresponde a um-ou-mais de a (ele busca o literal a+)". O LPIC pergunta exatamente sobre essa armadilha.

Solução de Problemas

Sintoma: grep 'a+' não corresponde a um-ou-mais

Causa: Em BRE, + é tratado como um caractere literal

Verificação:

grep 'a\+' file
grep -E 'a+' file

Solução: Use ERE (grep -E), ou escape como \+ em BRE.

Sintoma: Um ponto corresponde a qualquer caractere e causa falsos positivos

Causa: . significa qualquer caractere único em regex

Verificação:

grep '192\.168' access.log

Solução: Escape como \. para buscar um ponto literal. Para busca de string fixa, grep -F (fgrep) é seguro.

Sintoma: Não consegue buscar uma string contendo caracteres especiais

Causa: [ * $ etc. são interpretados como metacaracteres

Verificação:

grep -F '[error]' app.log

Solução: Se o padrão não precisa de regex, use grep -F para busca de string fixa. Escape apenas os caracteres necessários com \.

Lista de Verificação de Conclusão

  • [ ] Verificou correspondência de início/fim de linha com âncoras ^ $
  • [ ] Combinou classes de caracteres como [0-9] com quantificadores
  • [ ] Verificou a diferença BRE (\{3\}) vs ERE (grep -E '{3}') em uma máquina real
  • [ ] Experimentou as opções -v -o -c -i
  • [ ] Substituiu usando retrorreferências do sed -E (\1)

Resumo

Cenário Sintaxe Propósito
Correspondência início grep '^pattern' Extração de comentários/linhas específicas
Correspondência exata grep -x / ^...$ Correspondência de linha inteira
Um ou mais grep -E 'a+' Detectar caracteres repetidos
Apenas correspondência grep -o Obter apenas a parte correspondente
Substituir sed -E 's/.../.../' Reformatar com retrorreferências

Regex é a base do grep / sed / awk. Em seguida, avance para outras áreas do exame como mecanismos de links e prioridades de processos para conectar o conhecimento.

Próximas Leituras

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 — Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos Relacionados do LPIC-1

Prática