Eu tenho feito algumas pesquisas sobre como ler corretamente as linhas de um arquivo cuja última linha pode não ter um caractere de nova linha à direita. Encontrei a resposta em Ler um arquivo orientado a linha que pode não terminar com uma nova linha .
No entanto, tenho um segundo objetivo que é excluir os comentários no início das linhas e encontrei um grep
comando que atinge o objetivo
$ grep -v '^ *#' file
Mas notei que este comando tem um comportamento lateral (para mim inesperado): adiciona um caractere de nova linha à direita na última linha, se não existir
$ cat file
# This is a commentary
aaaaaa
# This is another commentary
bbbbbb
cccccc
$ od -c file
0000000 # T h i s i s a c o m m
0000020 e n t a r y \n a a a a a a \n #
0000040 T h i s i s a n o t h e r
0000060 c o m m e n t a r y \n b b b b b
0000100 b \n c c c c c c \n
0000111
$ truncate -s -1 file
$ od -c file
0000000 # T h i s i s a c o m m
0000020 e n t a r y \n a a a a a a \n #
0000040 T h i s i s a n o t h e r
0000060 c o m m e n t a r y \n b b b b b
0000100 b \n c c c c c c
0000110
$ od -c <(grep -v '^ *#' file)
0000000 a a a a a a \n b b b b b b \n c c
0000020 c c c c \n
0000025
Observe que, além de remover os comentários iniciais da linha, ele também adiciona um caractere de nova linha à direita na última linha.
Como poderia ser?
As especificações POSIX indicam que
O comportamento de
grep
é o esperado. Ele adiciona o caractere de nova linha à direita ausente ao arquivoincomplete line
.Deste jeito: