Pular para o conteúdo

Expressões regulares no Bash : parte I

Este é um tutorial sobre expressões regulares utilizando inteiramente o Bash - nada de 'sed' ou 'grep' (os quais eu gosto muito). O intuito é mostrar como usar RegExp no Bash puro mesmo. O tutorial é baseado em exemplos práticos.

Fernando Luis Basso FernandoBasso
Hits: 19.857 Categoria: Shell Script Subcategoria: Expressões Regulares
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Expressões Regulares no BASH – Parte 1

Introdução

Estes exemplos podem ser digitados diretamente na linha de comando, ou então colocados em arquivo. Não vou explicar isso detalhadamente agora, mas um script Bash pode ser algo como esse exemplo:

#!/usr/bin/env bash
var="programador"
substr="ama"
if [[ "$var" = *"$substr"* ]]; then
    echo "<$var> contém a substring <$substr>."
else
    echo "<$var> não contém a substring <$substr>."
fi


Substituições Básicas

Usamos a barra (/) como delimitador.

Substituir 'e' por 'E'. Somente a primeira ocorrência:

echo "${var/e/E}"

Para mudar todas as ocorrências de 'e' para 'E', usamos a barra duas vezes.

Dizemos que substitui "globalmente":

echo "${var//e/E}"

Para efeito de ilustração, vamos supor que queremos substituir o 'e' mais os próximos dois caracteres, não importa quais sejam, por 1, 2 e 3, respectivamente:

echo "${var//e??/123}"

Substituí o '!' por um ponto final '.'. Precisamos "escapar" o ponto de exclamação pois ele é um caractere especial no Bash.

echo "${var/\!/.}" # O '.' não é um metacaractere no Bash

Substituir espaços em branco por underscores - globalmente.

echo "${var// /_}"

Substituir . por ... :

echo "${var//./...}"

Remover do Início da String

Para remover parte do início de uma string, não usamos mais o delimitador (/), usamos apenas o '#' ou '##'.

Vamos aos exemplos.

Remove do início até o primeiro espaço. Um único # é non-greedy (não ganancioso/guloso).

echo "${var#* }"

Explicando: o # busca pelo início, o * é tudo, e o espaço em branco é o que queremos encontrar. Então, em português ficaria algo como "do início da string (#), tudo o que for possível (*), até o primeiro espaço em branco que encontrar ( )".

Remove do início até o último espaço em branco possível. ## é greedy.

echo "${var##* }"

Obs.: O glob vai ANTES do item que queremos encontrar. No exemplo, o * vem antes do espaço em branco.

Parar antes do ponto, ou seja, não incluir o ponto.

echo "${var##*([!.])}" # ! é o operador de negação ou "NOT"

Remove tudo, do início até o hífen (-).

echo "${var#*-}"

Remove do início até o espaço que vem após o hífen.

echo "${var#*- }"

Colocando em português, "do início (#), tudo (*), mais o hífen (-), e inclui o espaço em branco ( )".

Remover do Final da String

var="May the force be with you. Always! - Master Yoda."

Agora procuramos para trás. Por isso, o * vai do lado oposto do que vinhamos usando até agora e o operador '#' muda para '%'.

Pra frente: "${var#*-}"
Pra trás: "${var%-*}"


- É o que queremos encontrar. É importante observar que agora a expressão começa e ser procurada do fim do string e vai "caminhando" até o início.

Remove do fim até o primeiro espaço - contando de trás pra frente. Ou seja, o último contando do início:

echo "${var% *}"

Remove do final até o último espaço - contanto de trás pra frente. Ou seja, o primeiro contando normalmente:

echo "${var%% *}"

Remove do fim até o hífen:

echo "${var%-*}"

Remove do fim até o primeiro 'ç' que encontrar:

echo "${var%ç*}"

Se o caractere que queremos encontrar ocorre mais de uma vez na string, e queremos encontrar justamente a ocorrência que está o mais distante possível do final da string, usamos '%%' em vez de '%'. O 'e' mais distante do final da string nesse caso está na palavra 'Que' bem no início. Veja:

echo "${var%%e*}"

Previamente publicado em:
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Expressões Regulares no BASH – Parte 1

Prevenindo acidentes com o comando RM

Configuração de Indentação no Vim - Tabs e Espaços

Monitorar servidores e enviar alertas por e-mail e SMS

Recebendo seu IP dinâmico via email

Utilizando "expr" para "String Matching" através de expressões regulares em shell

Operadores de redirecionamento

Definição automática de wallpaper em função do horário

#2 Comentário enviado por lcavalheiro em 29/12/2011 - 12:34h
Adorei, favoritado.
#3 Comentário enviado por andrefreire em 29/12/2011 - 19:31h
Excelente contribuição, adicionado aos favoritos !!!
#4 Comentário enviado por rai3mb em 29/12/2011 - 20:53h
Ótima contribuição, esses detalhes relacionados ao Bash são difíceis de encontrar.
#5 Comentário enviado por danniel-lara em 30/12/2011 - 18:51h
parabéns é uma baita contribuição

Contribuir com comentário

Entre na sua conta para comentar.