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?

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

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