Este é o comportamento vi
esperado.
Seu arquivo tem uma última linha incompleta de maneira tão estrita (isto é, de acordo com o padrão POSIX), não é um arquivo de texto, mas um arquivo binário.
vi
, que é um editor de arquivos de texto e não um binário, corrige quando você os salva.
Isso permite que outras ferramentas de arquivo de texto, como wc
, sed
e os gostos, forneçam a saída esperada.
Observe que vi
não está em silêncio sobre o problema:
$ printf "one\ntwo" >file # Create a unterminated file
$ cat file # Note the missing newline before the prompt
one
two$ wc -l file # wc ignores the incomplete last line
1 file
$ sed '' file > file1
$ cat file1 # so does a legacy sed
one
$ PATH=$(getconf PATH) sed '' file
one # while a POSIX conformant sed warns you:
sed: Missing newline at end of file file.
two
$ vi file
one
two
~
~
~ # vi tells you too about the issue
"file" [Incomplete last line] 2 lines, 7 characters
:w
"file" 2 lines, 8 characters # and tells it writes two lines
# You'll even notice it writes one more
# character if you are a very shrewd observer :-)
:q
$ cat file # the file is now valid text
one
two
$ wc -l file # wc reports the expected number of lines
2 file
$ sed '' file > file1 # sed works as expected
$ cat file1
one
two
Note que, para obter algumas pistas sobre qual vi
version você está executando, você pode usar o comando :ve
. Ele mostra aqui que estou usando um SVR4 legado aqui, definitivamente não é vim
:
:ve
Version SVR4.0, Solaris 2.5.0
Aparentemente, o seu está dizendo:
:ve
Version 3.10
Isso provavelmente significa que AIX vi
é baseado no código-fonte SVR3.
Em qualquer caso, esse comportamento e a mensagem de aviso [Incomplete last line]
estão no código-fonte vi
do Bill Joy desde, pelo menos, 1979 e AFAIK, retidos em todas as ramificações criadas a partir das versões de código-fonte do System V. Unix proprietário como AIX foram construídos.
Cronologicamente falando, esse comportamento não é uma conseqüência da conformidade POSIX, mas mais uma consequência da decisão original de Bill Joy de ajudar os usuários a editar arquivos de texto falsos e, uma década depois, a decisão do comitê POSIX de manter essa tolerância .
Se você usar ed
em vez de vi
, notará que o primeiro é mais detalhado sobre o problema, pelo menos se o ed
for do SVR3 ou o mais novo ramo de origem:
$ ed file
'\n' appended
8
q
Note também que um arquivo vazio é um arquivo de texto válido que contém zero linhas. Como não há nenhuma linha não terminada para corrigir, vi
não acrescenta uma nova linha ao salvar o arquivo.