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,923评论 18 139
  • vim 选择文本,删除,复制,粘贴 文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v 从...
    壹首簡單的歌阅读 889评论 0 7
  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,185评论 3 49
  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 4,229评论 0 2
  • 关于告别,我能想到的是遗憾; 这是在我工作一年左右外婆传来噩耗走去远方而我却远在贵阳出差的去年; 鲜有征兆的被告知...
    沉小小小沦8023阅读 287评论 0 0