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