我很难理解一个奇怪的行为:当我没有专门键入它时,vi似乎在文件末尾添加了换行符(ASCII:LF,因为它是Unix(AIX)系统)。
我在vi中这样编辑文件(注意不要在末尾输入换行符):
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
我希望vi按原样保存它,所以要有39个字节:前三行(数字1至9,后跟换行符(在我的系统中为LF))中的每行10个ASCII字符,最后一行仅9行(字符1至9,无终止换行符/ LF)。
但是,当我保存它时,它显示为40个字节(而不是39个字节),并且od显示终止的LF:
# wc foo
4 4 40 foo ## I expected 39 here! as I didn't add the last newline
# od -a toto
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9 lf
0000050
## An "lf" terminates the file?? Did vi add it silently?
如果我使用printf创建的文件完全符合我在vi中所做的工作,则它将按预期工作:
# ## I create a file with NO newline at the end:
# printf "123456789\n123456789\n123456789\n123456789" > foo2
# wc foo2 ## This one is as expected: 39 bytes, exactly as I was trying to do above with vi.
3 4 39 foo ## As expected, as I didn't add the last newline
## Note that for wc, there are only three lines!
## (So wc -l doesn't count lines; it counts the [newline] chars... Which is rather odd.)
# root@SPU0WMY1:~ ## od -a foo2
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9
0000047 ## As expected, no added LF.
如果我使用vi重新打开文件,则两个文件(foo(40个字符)和foo2(39个字符)都看起来完全相同。
如果我在vi中打开foo2(39个字符,没有终止的换行符),并且不做:wq
任何编辑就直接写40个字符,并显示换行符!
我无法访问较新的vi(我想在AIX上使用vi(不是Vim)3.10版吗?(没有“ -version”或其他了解它的方法))。
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
在文件末尾静默添加换行符对vi(也许不是在较新的版本?还是Vim?)中正常吗?(我认为〜表示上一行没有以换行符结尾。)
-
编辑:一些其他更新和一些摘要,在很大程度上要感谢以下答案:
vi在写入缺少该文件的文件时会默默添加尾随换行符(除非文件为空)。
只有在撰写本文时才这样做!(即,直到您:w为止,您可以使用:e来验证打开文件时文件是否仍然...(即:它仍显示“文件名” [最后一行不完整] N行,M字符)。保存时,将自动添加换行符,而不会发出特定警告(它确实说明了保存了多少字节,但这在大多数情况下还不足以知道添加了换行符)(感谢@jiliagre与我讨论了有关打开vi消息,它帮助我找到了知道何时真正发生更改的方法)
这(静默更正)是POSIX行为!(请参阅@ barefoot-io答案以获取参考)
vi
通过运行:ve
命令来获取版本或至少有关其来源的线索。
ex
该:ver
命令的手册页。