correspondência de padrões grep

1

A seguinte instrução sempre retorna 1 quando estou esperando que ela retorne 0:

 echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"
    
por AlluSingh 08.08.2017 / 04:51

2 respostas

1

Você observou uma saída do código 1, assim:

$ echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"; echo code=$?
code=1

Para que funcione conforme o esperado, você precisa da opção -E ':

$ echo "ACI123456777-001-20170701.pdf" | grep -Ee "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"; echo code=$?
ACI123456777-001-20170701.pdf
code=0

-E ativa recursos estendidos de regex.

Se você realmente quiser usar o regex básico, que é o padrão, então você precisa adicionar vários escapes:

$ echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI\([0-9]\{9\}\)-\([0-9]\{3\}\)-\([0-9]\{8\}\).pdf$"; echo code=$?
ACI123456777-001-20170701.pdf
code=0

O significado de -e

A opção -e do grep precede um padrão de expressão regular:

$ echo "ACI123456777-001-20170701.pdf" | grep -e '^ACI'
ACI123456777-001-20170701.pdf

Se houver apenas um padrão, o grep não precisará de -e e você poderá omiti-lo:

$ echo "ACI123456777-001-20170701.pdf" | grep '^ACI'
ACI123456777-001-20170701.pdf

Se houver dois ou mais padrões, no entanto, -e é necessário:

$ echo "ACI123456777-001-20170701.pdf" | grep -e '^ACI' -e 'pdf'
ACI123456777-001-20170701.pdf
    
por 08.08.2017 / 04:56
-1
echo "ACI123456777-001-20170701.pdf"  | grep -q "ACI[0-9]\{9\}-[0-9]\{3\}-[0-9]\{8\}.pdf"
echo $?
    
por 08.08.2017 / 05:06