私は奇妙な動作を理解するのに苦労しています: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バイト:最初の3行(数字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?
vi内で行ったことを正確に行うprintfでファイルを作成すると、期待どおりに動作します。
# ## 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.
両方のファイル(foo(40文字)とfoo2(39文字)は、vi ...
そして、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(そしておそらく最近のバージョンではないでしょうか?(前の行が改行で終わらないことを〜が示していると思いました。)
-
編集:いくつかの追加の更新と少しの要約。以下の回答に大いに感謝します。
viは、ファイルが空の場合を除いて、それが欠落しているファイルを書き込むときに、末尾の改行をサイレントに追加します。
書き込み時にのみそうします!(つまり、:wまで、:eを使用して、ファイルを開いたままであることを確認できます...(つまり、「filename」が表示されます[最後の行は完全ではありません] N行、M文字)。保存すると、特定の警告なしに改行がサイレントに追加されます(保存するバイト数は示されますが、ほとんどの場合、改行が追加されたことを知るのに十分ではありません)(@jiliagreに感謝しますviメッセージを開くと、変更が実際に発生したときを知る方法を見つけるのに役立ちました)
これ(サイレント補正)はPOSIXの動作です!(参照については@ barefoot-ioの回答を参照してください)
vi
実行することで、バージョンまたは少なくともその起源に関する手掛かりを取得できる場合があります:ve
。
ex
は:ver
コマンドが通常記載されているマニュアルページを削除しました。