DOS、Mac 和 Unix 文件格式+ UltraEdit使用

1、文本格式區別
用UltraEdit打開unix文本文件時總會提示:是否將文件轉換爲dos格式。在windows編輯配置文件,而後用ftp上傳到linux主機,發現運行時讀取配置文件有錯。因爲沒有經驗,分析了半天。
UltraEdit另存爲有1.DOS終結符-CR/LF
   2.UNIX終結符-LF
   3.MAC終結符-CR
具體分析,在 utrledit下打開分別打開一個dos和unix的文本文件,而後選擇十六進制編輯,便可看到其編碼內容(能夠批量替換來轉格式 bat文件)。unix下的回車是用0x0A表示的,而dos下的回車則是0x0D0A。
在windows下用utraledit編輯後,能夠在文件菜單下找到轉換爲unix格式,而後再上傳主機。可是這時還有問題,由於有的ftp工具能夠選擇以文本或者二進制格式傳輸,這時則必須選擇二進制,不然傳輸時又會被改成dos格式。
unix文本文件和windows/dos文本文件的格式區別主要是兩點:
 
換行符:
                  unix(/n)                            windows/dos(/r/n)
Ctrl:            ^J                              ^M^J
Dec:           10                               13+10
Hex:            0A                              0D+0A
Code:          LF                               CR+LF
文件結束符:
                  unix                            windows/dos
Ctrl:            ^D                              ^Z
Dec:           04                               26
Hex:            04                              1A
ASCII模式和Binary模式的區別是回車換行的處理,Binary模式不對數據進行任何處理,ASCII模式將回車換行轉換爲本機的回車字符,好比:UNIX下是\n,Windows下是\r\n,Mac下是\r。
    ASCII模式下會轉換文件,不能說是不一樣系統對回車換行解釋不一樣,而是不一樣的系統有不一樣的行結束符。UNIX系統下行結束符是一個字節,即十六進制的0A,而Windows的系統是兩個字節,即十六進制的0D0A,因此當你用ASCII方式從UNIX的FTP Server下載文件到Windows系統上時(不論是二進制或者文本文件),每檢測到一個字節是0A,就會自動插入一個0D,因此若是你的文件是二進制文件,好比可執行文件、壓縮包什麼的,就確定不能用了。若是你的文件就是UNIX下的文本文件,你用ASCII模式是正確的,要是誤用了Binary模式,你在Windows上看這個文件是沒有換行的,裏面是一個個的黑方塊。
    通常來講,咱們最好都用Binary方式,這樣能夠保證不出錯。若是有文本格式轉換的問題,即UNIX格式的文本和DOS格式的文本之間的轉換,有不少工具能夠作的,不要在ftp傳輸的時候冒險,尤爲是你若是對這些東西不是很是清楚的話。
在printf這樣的函數中, 若是你出現一個\n, 它卻表明了一個邏輯上的意義, 即它表明在本地系統上的那種回車換行, 因此它在UNIX上只是<LF>, 但若是你在DOS上用諸如Truboc編程的話它輸出的是<CR><LF>。

 

 

UltraEdit 每次打開新文件的時候,都提示:

文件可能不是DOS格式,php

你要轉換 File 爲 DOS 格式嗎?html


高 級 -> 配置 -> 文件處理 -> DOS/UNIX/MAC 處理 -> UNIX/MAC 文件檢測/轉換 中,取消原先選擇的
檢測文件類型並提示進行更改,選取 禁用

 

 

DOS、Mac 和 Unix 文件格式 相信不少朋友都碰到過這三種文件格式的互換問題,今日又碰到這個問題,突然想 尋根問底,因而整理了本文檔。 文件格式區別 咱們先看看這三個傢伙有啥區別。linux

好久之前,人們用老式的電傳打字機做爲輸入設備,它使用 兩個字符來另起新行。一個字符把滑動架移回首位 (稱爲回車,),另外一個字符把紙上移一行 (稱爲換行,)。 當計算機問世後,因爲存儲器曾經很是昂貴。有些人就認定不必用兩個字符來表示行尾。因而 UNIX 開發者決定他們能夠用 一個字符來表示行尾。sql

Apple 開發者規定了用 。 開發 MS-DOS (以及微軟視窗) 的那些傢伙則決定沿用老式的 。三種行尾格式以下: unix dos mac 這意味着,若是你試圖把一個文件從一種系統移到另外一種系統,那麼你就有換行符方面的麻煩。 轉換 有需求就會有動力。編程

在Windows平臺,有強大的UltraEdit,它支持DOS、Mac 和 Unix 三種文 件格式的任意互換。在【文件】->【轉換】選項卡下有相應的對應選項,很傻很強大。vim

下面咱們看看在Unix/Linux平臺該如何作呢? windows

方法一:強大的dos2unix dos2unix filename 網絡

方法二:強大的腳本 sed 's/^M//' filename > tmp_filename 其中^M是同時Ctrl+V+M按出來的,表示回車。 或 tr -d "\r" filename 或 cat filename | perl -pe '~s/\r//g' > tmp_filename 函數

方法三:強大的vim vim filename :set fileformat=unix :w 或 vim filename :%s/^M//g :w 與vi不一樣,vim具備自動識別功能,只需以下設置就能夠自動進行轉換。不過因爲Mac格式比較特殊,vim對mac格式的自動探測可能會出錯。請參考: http://vimcdoc.sourceforge.NET/doc/usr_23.html vim filename :set fileformats=unix,dos,mac 批量轉換 有時候咱們可能但願對這種轉換進行批量處理。工具

在Windows下有強大的UltraEdit,用全局replace的方法或者創建工程的方法能夠批量轉換,請參考 http://tech.ddvip.com/2007-10/119380983936863.html 。Windows平臺下還有不少相關的小工具,如MultiU2D等,google一下吧。 在Unix/linux平臺下咱們就要藉助腳本文件或者通道了,實質上是上述幾種方法的自動化。

下面舉幾個簡單例子,來源自 http://bbs.chinaunix.net/viewthread.PHP?tid=412957&extra=&page=1 :

腳本1: ls -l | awk '{print $8}' > filename.txt N=1 NN=`wc -l filename.txt | awk '{print $1}'` while [ "$N" -le "$NN" ]; do TempLine=`sed -n "$N"p "filename.txt"` if [ -n "$TempLine" ]; then tmpfilename=$TempLine dos2ux $tmpfilename > file mv file $tmpfilename fi N=$(($N + 1)) done

腳本2: for XFILE in $(egrep -l ^M `find . -name "*.txt";find . -name "*.sql"`) do echo "開始處理文件"$XFILE if [ -s $XFILE ] then TMPFILE=$XFILE.tmp mv $XFILE $TMPFILE tr -d "\r" $XFILE rm $TMPFILE else continue fi done 通道法: find . -type f |xargs -i dos2unix {} 後記 對於Mac格式轉換到其餘兩種格式的方法相似,在類Unix環境下有dos2unix/mac2unix工具。 在計算機世界,格式轉換無處不在,如字符格式、壓縮格式、網絡協議格式、音視頻格式等等。因此進行相關工做時,應該多多留意。

相關文章
相關標籤/搜索