今天碰到一個很有趣的問題畏纲,就是有一個文件,我們需要得到他的行數(shù)敏晤,明明是 n
行的文本桨吊,使用 wc
命令總會少一行威根。
wc -l foo.txt
當(dāng)時我的第一反應(yīng)是 wc
命令應(yīng)該和最后一行沒有換行符有關(guān),因為那個文件的內(nèi)容是使用下面的代碼生成的视乐,這樣的話就能解釋為什么得到 n-1
這個結(jié)果了洛搀。
$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.
的確如此佑淀,那么問題就解決了嗎留美?當(dāng)然沒有,因為當(dāng)時還有一個奇怪的現(xiàn)象,就是如果我使用 vim
編輯并保存這個文件谎砾,wc
命令的結(jié)果就恢復(fù)“正撤瓯叮”了。
后來我開始懷疑有不可見字符景图,而且這個字符是 vim
加的较雕。我當(dāng)時是這樣 Google 的。
vim auto newline end of file
果然被我找到了一個回答挚币。我們可以當(dāng)場做一個實驗亮蒋,先使用 vim
新建一個文件,名為 foo.txt
妆毕,輸入下面的文本慎玖。
a
b
再運行 wc -l foo.txt
,結(jié)果會是 2
笛粘。然后我們使用回答里的命令趁怔,重新保存文件。
vim -b foo.txt
:set noeol
:wq
再運行 wc -l foo.txt
闰蛔,結(jié)果會是 1
痕钢,因為關(guān)掉了文件未尾自動加的換行图柏。這就是為什么之前用 vim
保存過后(即使不編輯)序六,wc
的結(jié)果還是會改變的原因。
這讓我想起了以前使用 VC6.0
寫 C
的時候蚤吹,源文件最后如果沒有多出一個空行例诀,就會警告,提到 VC6.0
真是懷念啊裁着,可能這就是我的青春吧繁涂,狗日的哈哈哈。
最后二驰,這個本質(zhì)其實是和 POSIX
對 newline
的定義有關(guān)的扔罪,這樣所有問題都能解釋了。
3.206 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
晚上在全家買了一罐櫻桃味的可樂桶雀,然后解決了問題矿酵,很開心 \m/