Sim, em (por favor cite o regex ou será interpretado como um shell glob):
grep -Eq '[0-9]{7}' <<< "1505082"
grep corresponde aos 7 dígitos. Você pode ver o que está sendo correspondido, substituindo o q por um o
:
$ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?"
1505082
0
E sim, também corresponderá a isso:
$ grep -Eq [0-9]{7} <<< "150508299999"; echo "$?"
1505082
0
Removeu todos os noves.
O problema é que você está fazendo uma correspondência não ancorada e corresponderá a um número de 7 dígitos ( ou mais ).
Você pode ancorar com:
$ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?"
1
Para corresponder um número de 7 dígitos em qualquer lugar e seguido ou precedido por não dígitos, você precisa de uma âncora completamente diferente:
$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $?
1505082
0
$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $?
1505082
0
$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $?
0
Essas são correspondências lookahead, uma é uma retrospectiva:
(?<=^|[^0-9])
Isso corresponde ao início da string ( ^
) ou a um não dígito. O outro é um lookahead:
(?=[^0-9]|$)
que correspondem a um não dígito ou ao final da string.
A única outra alternativa com Extended
regex mais simples é extrair qualquer execução de 7
(ou mais) dígitos e, em seguida, confirmar que são exatamente 7 dígitos:
$ echo "150508299_CSE_322" |
grep -oE '[0-9]{7,}' |
grep -qE '^[0-9]{7}$'; echo "$?"
1