Jedi Tux

Expressões Regulares no BASH – Parte 1

Posted in Bash by Fernando Basso on 24 de dezembro de 2011

BASH – Expressões Regulares

Saturday, 10:33 – December 24 – 2011

  1. Introdução
  2. Verificando por Sub-Strings
  3. Substituições Básicas
  4. Remover do início da string
  5. Remover do fim da string

Introdução

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

  #!/usr/bin/env bash

  # Descomente a próxima linha para um output mais verbose.
  #set -xv

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

  if [[ -z "$var" ]]; then
      echo "A string é vazia."
  else
      echo "A string não é vazia."
  fi # Fim do 'if'.

  # Script termina aqui.

Com o terminal na pasta onde está o script, execute este comando para
rodar o script:

bash nome_do_script

Vamos criar uma variável contendo uma string. Essa variável/string
será usada nos exemplos.

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

Mostrar quantos caracteres uma string possui.

echo "${#var}"

Voltar


Verificando por Sub-Strings

Colocamos a sub-string desejada entre ‘*’ (o chamado glob). Vamos
verificar se a string contém a sub-string ama:

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

Colocando a sub-string e uma variável, o código ficaria assim:

#!/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

Voltar


Substuiçõ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, suponhamos 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}"

Substitui 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. 

Subsituir spaços em branco por underscores – globalmente.

echo "${var// /_}"

Substituir . por …:

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

Voltar


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.

Remover 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##* }"

NOTE que 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 (*),continua até o hífen (-), e inclui o espaço em branco ( )”.

Voltar


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 dele 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
como ficaria o código:

echo "${var%%e*}"

Voltar


A maior parte do que postei aqui eu aprendi no site
wooledge.org – um excelente site
sobre shell scripting com o bash. O que não aprendi lá aprendi lendo na web, conversando em IRCs, forums, e nos –help e man (que confesso serem
difíceis de entender as vezes).

Por enquanto é isso. Teremos mais exemplos em futuros posts.

Tagged with: , , ,

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: