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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.