Usando regex dentro da cláusula if no bash

10

Veja isso se o bloco:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Isso deve ser impresso "correspondido", mas não. Onde eu estou errando?

Majid Azimi
fonte

Respostas:

21

Você precisa remover a citação na correspondência de regex.

if [[ ${str} =~ m\.m ]]; then

Na página do manual do bash:

[...] Um operador binário adicional, = ~, está disponível, com a mesma precedência que == e! =. Quando usada, a corda à direita do operador é considerada uma expressão regular estendida e é correspondida de acordo (como na regex (3)). O valor de retorno é 0 se a sequência corresponder ao padrão e 1 caso contrário. Se a expressão regular estiver sintaticamente incorreta, o valor de retorno da expressão condicional será 2. Se a opção de concha nocasematch estiver ativada, a correspondência será realizada sem considerar o caso de caracteres alfabéticos. Qualquer parte do padrão pode ser citada para forçá-lo a corresponder como uma sequência.

Portanto, com as aspas, você está usando a correspondência de cordas antiga.

Se você precisar de espaços no padrão, basta escapar deles:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then
Esteira
fonte
mas sem aspas duplas, não podemos usar caracteres de espaço no padrão regex. Há alguma solução para isso?
Majid Azimi
11
O espaço deve ser escapado como \ .
ДМИТРИЙ МАЛИКОВ
Se eu quiser encontrar uma string que termine com um número dinâmico, use ${str} =~ "needle"[0-9]{1}ou devo usar ${str} =~ needle[0-9]{1}?
mgutt