Bash: WC命令與VIM的行數問題

今天碰到一個很有趣的問題,就是有一個文件,我們需要得到他的行數,明明是 n 行的文本,使用 wc 命令總會少一行。

wc -l foo.txt

當時我的第一反應是 wc 命令應該和最后一行沒有換行符有關,因為那個文件的內容是使用下面的代碼生成的,這樣的話就能解釋為什么得到 n-1 這個結果了。

$filecontent = implode("\n", $arr);

man 一下 wc 的命令說明。

A line is defined as a string of characters delimited by a <newline> character. Characters beyond the final <newline> character will not be included in the line count.

的確如此,那么問題就解決了嗎?當然沒有,因為當時還有一個奇怪的現象,就是如果我使用 vim 編輯并保存這個文件,wc 命令的結果就恢復“正常”了。

后來我開始懷疑有不可見字符,而且這個字符是 vim 加的。我當時是這樣 Google 的。

vim auto newline end of file

果然被我找到了一個回答。我們可以當場做一個實驗,先使用 vim 新建一個文件,名為 foo.txt,輸入下面的文本。

a
b

再運行 wc -l foo.txt,結果會是 2。然后我們使用回答里的命令,重新保存文件。

vim -b foo.txt
:set noeol
:wq

再運行 wc -l foo.txt,結果會是 1,因為關掉了文件未尾自動加的換行。這就是為什么之前用 vim 保存過后(即使不編輯),wc 的結果還是會改變的原因。

這讓我想起了以前使用 VC6.0C 的時候,源文件最后如果沒有多出一個空行,就會警告,提到 VC6.0 真是懷念啊,可能這就是我的青春吧,狗日的哈哈哈。

最后,這個本質其實是和 POSIXnewline定義有關的,這樣所有問題都能解釋了。

3.206 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

晚上在全家買了一罐櫻桃味的可樂,然后解決了問題,很開心 \m/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • vim 選擇文本,刪除,復制,粘貼 文本的選擇,對于編輯器來說,是很基本的東西,也經常被用到,總結如下: v 從...
    壹首簡單的歌閱讀 889評論 0 7
  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關系?...
    Zero___閱讀 3,184評論 3 49
  • 首先,我們在使用前先看看HDFS是什麼?這將有助于我們是以后的運維使用和故障排除思路的獲得。 HDFS采用mast...
    W_Bousquet閱讀 4,228評論 0 2
  • 關于告別,我能想到的是遺憾; 這是在我工作一年左右外婆傳來噩耗走去遠方而我卻遠在貴陽出差的去年; 鮮有征兆的被告知...
    沉小小小淪8023閱讀 287評論 0 0