Corresponde ao número exato de dígitos em uma string

1

Dada uma string, como posso descobrir que ela contém exatamente 7 dígitos consecutivos?

Como 1505082 ou 1505082_CSE_322 , mas não 15050821 ou 15050821_CSE_322

Eu tentei

grep -Eq [0-9]{7} <<< "1505082" 

que retorna 0 , mas

grep -Eq [0-9]{7} <<< "15050821"' 

também retorna 0 .

O que estou fazendo de errado?

    
por Robur_131 10.11.2018 / 03:16

2 respostas

2

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
    
por 10.11.2018 / 03:48
0

Quando as coisas ficam complicadas com grep , você sempre pode usar egrep ou até mesmo uma linguagem de programação disponível em um sistema linux / unix para ajudá-lo com suas correspondências / regexp.

Se o seu sistema tiver perl ou ruby, você poderá fazer isso em uma linha:

echo 1234567| ruby -lne 'print if /^\d{7}$/'

echo 1234567| perl -lne 'print if /^\d{7}$/'

ou

cat file.txt | ruby -lne 'print if /^\d{7}$/'

    
por 10.11.2018 / 15:47