Como faço para usar expressões regulares em scripts bash?

83

Quero verificar se uma variável tem um ano válido usando uma expressão regular. Lendo o manual do bash , entendo que posso usar o operador = ~

Olhando para o exemplo abaixo, eu esperaria ver "não está OK", mas vejo "OK". O que estou fazendo errado?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi
idrosídeo
fonte
possível duplicata do bash regex com aspas?
outis 01 de
Observe que isso estava falhando por causa da falta de espaços ao redor =~.
fedorqui 'SO pare de prejudicar'

Respostas:

116

Foi alterado entre 3.1 e 3.2:

Esta é uma descrição concisa dos novos recursos adicionados ao bash-3.2 desde o lançamento do bash-3.1.

Citar o argumento de string para o operador [[command's = ~ agora força a correspondência de string, como com os outros operadores de correspondência de padrão.

Portanto, use-o sem as aspas desta forma:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
paxdiablo
fonte
1
Como faço para lidar com a situação em que o regex contém espaços se não posso citar? Se a regex for, por exemplo, a +bela relatará um erro de sintaxe ...
Alderath
5
@Alderath: use a\ \+bpara escapar do espaço e do caractere de adição.
blinry de
8

Você precisa de espaços ao redor do operador = ~

i = "teste"
if [[$ i = ~ "200 [78]"]];
então
  echo "OK"
outro
  echo "não está bem"
fi
Michiel
fonte
3
A resposta do paxdiablo está certa, adicionar espaços aqui não ajuda (agora você também obtém "não está OK" para 2008, a única string que corresponde é literalmente "200 [78]").
Marcel Stimberg