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.

[ Hits: 15.848 ]

Por: Fernando Luis Basso em 29/12/2011


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:
   

Páginas do artigo
   1. Expressões Regulares no BASH – Parte 1
Outros artigos deste autor

Prevenindo acidentes com o comando RM

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

Leitura recomendada

Monitorar servidores e enviar alertas por e-mail e SMS

Redirecionamentos, Pipes e Fluxos

Operadores de redirecionamento

Recebendo seu IP dinâmico via email

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

  
Comentários
[1] Comentário enviado por FernandoBasso em 29/12/2011 - 10:51h

A parte 2 deste tutorial já encontra-se no meu blog:

http://jeditux.wordpress.com/2011/12/25/expressoes-regulares-no-bash-parte-2/

Agradeço desde já sugestões e possíveis correções.

[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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts