一、背景
由於windows和linux對換行的標識不一樣,不同系統的代碼傳遞導致代碼格式的改變中可能會帶來程序無法正常編譯通過的問題。因此根據一些編譯的錯誤提示,可以定位到是文件格式的問題,要對程序的文本文件進行轉換。
二、解決方法
windows標識一行的結束用的是回車換行符,即'\r\n',也叫做CRLF。linux對一行結束的標識則只有換行,即'\n',也就是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打開文件,搜索'\r\n',看每行末尾是否存在。存在則通常是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/\n//g
刪除換行符
總結見如下表:
:set fileformat |
設置文件格式 |
:set endofline |
設置文件結束符 |
:set noendofline |
取消文件結束符 |
:set list |
進入List Mode |
:set nolist |
退出List Mode |
:%s/\n//g |
刪除換行符 |
:set textwidth |
設置行寬 |
:set textwidth |
設置行邊距 |
:join |
合並多行 |
J |
合並兩行 |
