將DOS/Windows檔案格式管換成Unix/Linux格式

Linux 跟 Windows 的文字檔,使用的換行控制不同,造成檔案在這兩個作業系統之間傳輸(ex:FTP、scp、WinSCP…),必須要注意格式轉換:

Linux的換行控制:\n(0D)

Windows的換行控制:\r\n(0D 0A)

如果是一個由 Linux 的 vi 編輯器產生的文字檔,換行控制應該只有『\n』,例如:

image

這個 shellscript ,是可以正常執行的:

image

但是,如果從 Windows 編輯 shellscript,再將檔案傳到 Linux,傳輸過程中如果沒有正確的格式轉換,就會變成:

image

用 cat 無法分辨差別,必須要 od -c 才能看出差異,此時,這個 shellscript 是無法正確執行的:

image

解決辦法有幾種:

1.重新重送,選擇正確的格式轉換(例如:FTP傳輸檔案時,指定 ascii 的方式)

2.在 Linux 下,用指令轉換格式:

tr -d ‘\r’ < windowsfile.txt > linuxfile.txt

image

3.在 vi 或 vim 環境,設定參數:

image

再另存新檔(當然,要直接 overwrite 原檔案也可以)

image

image

4.用 awk 指令也可以:

awk ‘{ sub(“\r$", “"); print }’ windowsfile.txt > linuxfile.txt

image

其實方法相當多,以下就是一些相關的補充:

1. dos2unix / unix2dos ,以 RHEL 為例,必須要先安裝 dos2unix*.rpm 及 unix2dos*.rpm,才有這兩個指令可以使用:

image

dos2unix windowsfile.txt linuxfile.txt
unix2dos linuxfile.txt windowsfile.txt

2. 用 awk 指令:

awk ‘{ sub(“\r$", “"); print }’ windowsfile.txt > linuxfile.txt
awk ‘sub(“$", “\r")’ linuxfile.txt > windowsfile.txt

3. 用 perl 指令:

perl -p -e ‘s/\r$//’ < windowsfile.txt > linuxfile.txt
perl -p -e ‘s/\n/\r\n/’ < linuxfile.txt > windowsfile.txt

另外,vi / vim 也可以互換格式,可以參考 vi / vim 的說明文件

其他相關網址:

How do I convert between Unix and Windows text files?

Save a text file in Unix dos style or unix style

Convert DOS line endings to Linux line endings in vim

Linux和Windows的換行字元

廣告
本篇發表於 網路, Linux, Windows。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s