Por que o grep precisa de um ponto em um regex usando '$'?

4

Eu pensei que sabia grep, mas talvez não.

Eu quero encontrar todas as linhas em um arquivo que termina com ':' Se eu correr

grep :$ ~/greptester.txt

mas para minha surpresa, não dá resultados. Às vezes confundo '^' e '$', tendo que adivinhar qual é começar e qual é o fim da linha, mas eu verifiquei e $ é de fato o fim de uma linha.

Depois de muita confusão, descobri acidentalmente que a corrida

grep :.$ ~/greptester.txt

dá os resultados esperados. Por quê?

Aqui está o arquivo de texto:

test line one
1 line with a colon:
ignore this line
3456 some stuff:
cat: meow; dog: bark; horse: four (4) legs.
goat, 7 elephants

Isso acontece tanto no Ubuntu quanto em uma máquina Windows com o Cygwin.

    
por DarenW 17.09.2013 / 02:18

1 resposta

6

Seu arquivo tem finais de linha \r\n (CR + LF) (provavelmente, criados no Windows?), enquanto a maioria dos arquivos UNIX termina apenas em \n (LF).

Portanto, antes que o grep veja o \n após o caractere : , há o \r que ele precisa corresponder ao caractere curinga . .

    
por 17.09.2013 / 02:30

Tags