一、背景
由于windows和linux对换行的标识不一样,不同系统的代码传递导致代码格式的改变中可能会带来程序无法正常编译通过的问题。因此根据一些编译的错误提示,可以定位到是文件格式的问题,要对程序的文本文件进行转换。
二、解决方法
windows标识一行的结束用的是回车换行符,即' ',也叫做CRLF。linux对一行结束的标识则只有换行,即' ',也就是LF。将程序从windows下copy至linux下时,只需要使用如下命令对所有的文件进行格式转换即可(参考[1])。
find . -type f -exec dos2unix {} ;
三、查看文件类型的方法
3.1windows下使用notepad++的话,可以设置显示所有字符(参考[2]),且notepad++右下角会显示文件类型。
3.2linux下使用vim(参考[3])
使用vim打开文件,输入:set ff?。根据返回结果可以文件类型
3.3linux下使用gedit
使用gedit打开文件,搜索' ',看每行末尾是否存在。存在则通常是dos类型,不存在则是unix类型。
四、参考文献
[1]linux - dos2Unix command on entire directory - Stack Overflow
[2]3.10. Notepad++支持显示回车符,换行符,TAB键,行首,行尾等特殊字符
[3]File format - Vim Tips Wiki
五、拓展
在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点。
解决这个问题的办法就是,用两个字符:一个字符<Return>来移到第一列,另一个字符<Line feed>来新增一行。计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。
UNIX人认为在到达一行的结尾时新增一行<Line feed> (LF),而Mac人则认同<Return> (CR)的解决办法,MS则坚持古老的<Return><Line feed> (CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而Vim编辑器则会自动的认出这种文件格式方面的区别,并做出相应处理。
:set fileformats=unix,dos
unix文件格式作为第一选择,dos格式作为第二选择,尤其需要注意的是shell、python等脚本需要保存为unix格式,因为不然你在linux下直接运行时会提示:No such file or directory,因为Linux把换行符也当成脚本解释器的一部分了。
:set fileformat
查看文件格式
:set fileformat=unix/dos
设置(转换文件格式)
:set endofline/noendofline
设置文件末尾是否自动增加换行符
:set list/nolist
设置是否显示不可见字符,注意此选项受set listchars约束
:%s/ //g
删除换行符
总结见如下表:
:set fileformat |
设置文件格式 |
:set endofline |
设置文件结束符 |
:set noendofline |
取消文件结束符 |
:set list |
进入List Mode |
:set nolist |
退出List Mode |
:%s/
//g |
删除换行符 |
:set textwidth |
设置行宽 |
:set textwidth |
设置行边距 |
:join |
合并多行 |
J |
合并两行 |