换行幽灵——Vim的诡异问题

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,人生的大起大落真是太刺激了。

当然,合集的版主和发问和回帖的版友才是真正应该感谢的对象。

 

这,就是一个小程序员愉快的一天。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值