Problema decodificando a saída de regex {m, n} em sed

2

Eu criei um arquivo 'numbers.txt'

1
12
123
1234
12345
123456

Eu estava praticando a expressão regular da forma {m, n} que se refere a "pelo menos m e no máximo n ocorrências do caractere anterior".

Agora, quando eu uso

sed -n '/^[0-9]\{1,3\}/ p' numbers.txt

exibe todas as linhas no arquivo numbers.txt.

No entanto, quando eu uso

sed -n '/^[0-9]\{1,3\}$/ p' numbers.txt

o comando exibe apenas as linhas que possuem pelo menos um e no máximo três caracteres.

Por que é necessário colocar esse '$'? Pelo que entendi, colocar $ significa que estou tentando encontrar as linhas que terminam em pelo menos 1 e no máximo três caracteres.

Além disso, por que o primeiro comando imprime todas as linhas?

    
por Upendra Pratap Singh 02.08.2016 / 15:32

2 respostas

1

Esta expressão regular:

^[0-9]\{1,3\}

informa ao sed para procurar:

  • ^ - o começo da linha, seguido por
  • [0-9] - um único dígito, \{1,3\} - repetido de 1 a 3 vezes, seguido por
  • nada ou nada

... que corresponde a todas as linhas da sua entrada de amostra, como você viu. Ele corresponde às três primeiras linhas porque elas começam com um, dois ou três dígitos. Ele combina com as linhas subsequentes porque todas começam com 3 dígitos (e continuam, mas o regex não se importa).

As expressões regulares são "gulosas", o que significa que, por padrão, elas corresponderão o máximo que puderem (dada toda a flexibilidade que você codifica em todo o regex), mas também "preguiçoso", pois não precisam corresponde à linha inteira, a menos que você a ancore especificamente em ambas as extremidades com ^ e $ .

Assumindo que sua intenção é dizer ao sed para imprimir somente as linhas que têm exatamente um a três dígitos, você precisa dizer à expressão regular que é todo você quero ver na linha inteira, o que requer a âncora final.

    
por 02.08.2016 / 19:06
0

Desmistificando o segundo caso

sed -n '/^[0-9]\{1,3\}$/p' file
  • O ^ corresponde ao início da string
  • [0-9]\{1,3\} permite de um a três dígitos decimais
  • $ corresponde ao final da string (está dizendo, ok, não quero mais nada para o registro)

Comparando com o primeiro caso, o $ faz a diferença no segundo.

    
por 02.08.2016 / 16:19

Tags