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: