Vim是个相当不错的工具,我一直用它。但就算是一款如此牛逼的工具,偶尔也会给你的生活带来麻烦,就像所有好用或不好用的工具一样,就像我那部老旧的剃须刀一样(它更像个绞肉机,只是附带了切割胡须的功能)。
回到今天的主题,我最近在用Python写一个解析日志的小工具,非常简单。因为需要解析的日志之格式是每行一条记录,因此这个解析器的全部功能就是读入一行日志,然后解析它。
虽说Linux保证不同进程对于用O_APPEND标志打开的同一文件写入是原子操作,但它并没有说读入也是原子操作(当然更可能是我比较土),更不用说是用C语言写入和用Python来读了,所以和所有具有强迫症倾向的程序员一样,我考虑了最后一行的边界情况——可能会读出半行日志。
查询Python手册,她说file对象的readline方法特意为您考虑了这一问题,所以在读出正常的行时会在行尾追加一个换行符,而最后一行如果是文件末尾,则不会追加。多么周到的服务!
于是狂写10行代码。测试,发现每一行末尾都有换行,哦,可能是这回的日志比较规范,且看我截去最后一行试试,用Vim打开,输入Gdd:wq,测试,发现每一行末尾都有换行。
这时我已经变得有点神神叨叨了,虽然说我可以每次多读一行,根据是否eof来决定是否回滚,但为啥要让我可怜的大脑(和计算机CPU)来承受这一切?我开始谴责Python手册,并和同事诉苦,他表示同意,于是我决定假装没有遇到这个问题。
今天晚一些时候,上水木解闷,手指自动敲入LinuxDev(可怜的IT民工!),发现一个合集
28560 eheh Aug 20 ● [合集] ll 显示的文件大小比实际大一个字节
打开一看,原来vi会自动添加一个回车到末尾。自己试试,vim打开一个文件,写入一个字符,保存,退出后ll,果然是2 !
接下来的事情就简单了,手指自动敲入vim回车Ctrl-g 6回车,果然看到一个帖子,
32 VChart Jun 3. ● 末尾多了个不可见回车符
根据帖子中的提示,利用vim的帮助(help eol),输入命令“:set noeol”、“:set binary”和“:w”,vim提示“[noeol] 1L, 1C written”,果然如此。
试了一下Python,readline确实没有了最后一行的/n。
感谢水木,感谢康神,感谢CCAV,人生的大起大落真是太刺激了。
当然,合集的版主和发问和回帖的版友才是真正应该感谢的对象。
这,就是一个小程序员愉快的一天。