Por que minha condição de repetição com o intervalo grep não está funcionando?

2

Pesquisei uma solução em SO, Ask e Unix / Linux, mas estou perdido tentando descobrir como escrever uma condicional com um intervalo de grep:

Passar por:

1-20_something
100-200_something
2-100_something
11-333_something
O código

funciona, mas apenas em 1-9_something :

if grep -q '[0-9]-[0-9]_something' "$foobar"; then
    echo "Additional Code"
fi

não funciona:

if grep -q '\d{1,3}-\d{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

e isso não funciona:

if grep -q '[0-9]{1,3}-[0-9]{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

Qual é a melhor maneira de percorrer {1,3} ?

EDITAR:

Para ajudar a próxima pessoa que pode se deparar com isso, fiz muita pesquisa e, depois das respostas dadas, consegui:

por DᴀʀᴛʜVᴀᴅᴇʀ 23.08.2015 / 03:02

2 respostas

3

Os colchetes encaracolados { } são tratados como literais no BRE (Basic Regular Expression). De man grep :

   Basic vs Extended Regular Expressions
       In  basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their
       special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

Então você precisa de

grep '[0-9]\{1,3\}-[0-9]\{1,3\}_something'

ou habilite o modo Extended Regular Expression com a opção -E

grep -E '[0-9]{1,3}-[0-9]{1,3}_something'
    
por steeldriver 23.08.2015 / 03:11
2

Sua segunda tentativa deve funcionar se você ativou o PCRE (expressões regulares compatíveis com Perl) usando -P :

grep -Pq '\d{1,3}-\d{1,3}_something'

\d não está em BRE ou ERE ou na lista de expressões extras de barra invertida que o GNU Grep tem, mas é uma coisa do Perl.

Sua terceira tentativa deve funcionar se você ativou ERE (expressões regulares estendidas) :

grep -Eq '[0-9]{1,3}-[0-9]{1,3}_something'

<exp>{m,n} não é uma construção BRE (expressão regular básica).

    
por muru 23.08.2015 / 03:10