批量將目錄下所有文件進行 dos/unix 格式轉換 | 您所在的位置:網站首頁 › mac如何改文件格式 › 批量將目錄下所有文件進行 dos/unix 格式轉換 |
一、問題產生的原因: DOS/Windows和Linux/Unix的文件換行回車格式不同,基于 DOS/Windows 的文本文件在每一行末尾有一個 CR(回車)和 LF(換行),而 UNIX 文本只有一個換行。 對于換行這個動作,unix下一般只有一個0x0A表示換行("\n"),windows下一般都是0x0D和0x0A兩個字符("\r\n"),蘋果機(MAC OS系統(tǒng))則采用回車符CR表示下一行(\r) Unix系統(tǒng)里,每行結尾只有“”,即“\n”; Windows系統(tǒng)里面,每行結尾是“”,即“\r\n”; Mac系統(tǒng)里,每行結尾是“”,即“\r”。 一個直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix下打開的話,在每行的結尾會多一個^M字符。即 "\r" = ^M Dos和windows采用回車+換行 CR+LF(\r\n)表示下一行,即^M$($不是換行符的表示,換行符沒有表示出來,$是文本結束EOF的表示); UNIX/Linux采用換行符LF表示下一行,即\n;LF使用'\n'符號表示, ASCII代碼是10, 十六制為0x0A.? MAC 系統(tǒng)則采用回車符CR表示下一行,即\r;CR用符號'\r'表示, 十進制ASCII代碼是13, 十六進制代碼為0x0D; 所以Windows平臺上換行在文本文件中是使用 0d 0a 兩個字節(jié)表示, 而UNIX和蘋果平臺上換行則是使用0a或0d一個字節(jié)表示.由于dos風格的換行使用\r\n,把這樣的文件上傳到unix,有些版本的vi不能識別\r,所以vi顯示時在行尾會出現(xiàn)^M出來,但是有些就能識別\r\n,正常顯示回車換行。 二、用sed進行轉換 以下 sed 調用將把 DOS/Windows 格式的文本------->>可信賴的 UNIX 格式:?? sed -i 's/^M$//g' 即尋找以 ^M 結尾的行,string^M\n----》string\n. sed -i 's/\r$//g' ? ?#這個命令也可以。
反過來,也可以把UNIX---->DOS. ? ?\n----->\r\n. sed -i 's/$/\r\n/' ? ? ?#在該腳本中,'$' 規(guī)則表達式將與行的末尾匹配,而 '\r' 告訴 sed 在其之前插入一個回車。在換行之前插入回車,立即,每一行就以 CR/LF 結束。 1. vim中查詢修改文件編碼格式 :set ff 查看當前文本的模式類型,一般為dos,unix :set ff=dos 設置為dos模式, 也可以用 sed -i 's/$/\r/'? :set ff=unix 設置為unix模式,也可以用一下方式轉換為unix模式:sed -i 's/.$//g' :set fileencoding查看現(xiàn)在文本的編碼 :set fenc=編碼 轉換當前文本的編碼為指定的編碼 :set enc=編碼 以指定的編碼顯示文本,但不保存到文件中。這里的“編碼”常見為gbk utf-8 big5 cp936 2. 在Linux/Window下批量處理文件格式 2.1 使用 sed + grep?#sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目錄`? eg:??sed -i 's/$/\r/g' `grep '$' -rl .` ? #批量轉unix to dos (親測可用) 2.2 使用find + sed eg: find . -name "*.tcl" | xargs sed -i 's/\r$//g' ? ?#批量轉dos to unix (親測可用!)
2.3 ?在git 下,對已經編輯過的文件進行轉換。
git status |grep ".tcl"|sed "s/modified: ? //"|xargs sed -i "s/\r$//g" 其他方法:? 在Vim顯示^M字符的原因:在Windows下?lián)Q行使用CRLF兩個字符來表示,其中CR為回車(ASCII=0x0D),LF為換行(ASCII=0x0A),而在Linux下使用LF一個字符來表示。在Linux下使用vi來查看一些Windows下創(chuàng)建的文本文件時,有時會發(fā)現(xiàn)在每一行尾部有^M字符,其實它是顯示CR回車字符。 sublime 設置為:windows使用的CRLF,unix使用的是 LF。按你的情況,應該在Setting-User中設置"default_line_ending":"unix"就可以解決這個問題。 下面有一些方法可以處理這種問題(其實這只是Windows和Linux平臺表示回車的方法不一樣而已!!!!)。 2.1 使用dos2unix 一般Linux發(fā)行版中都帶有這個小工具,只能把DOS轉換為UNIX文件,命令如下: # dos2unix dosfile.txt ? ? ? 命令會去掉行尾的^M符號。 2.2 使用tr 使用tr命令拷貝標準輸入到標準輸出,替換或者刪除掉選擇的字符,只能把DOS轉換為UNIX文件,命令如下: # tr -d ‘\r’< dosfile.txt > unixfile.txt 2.3 使用vim Vim是一個vi的改進版本,可以運行在Windows和Linux平臺上,使用方法如下: DOS轉UNIX::setfileformat=unix UNIX轉DOS::setfileformat=dos 你也可以使用ff來替代fileformat 注:為了能讓vim可以自動識別DOS和UNIX文本文件格式,可以在.vimrc(Linux)或_vimrc(Windows)配置文件中加入如下一行設置: ? ? ? ? ?setfileformats=dos,unix ? ? ? ? ?設置完成后,使用vim打開DOS文本文件就不會顯示^M字符了。 2.4 使用sed ? ? ? ? ?在DOS文件格式中使用CR/LF換行,在Unix下僅使用LF換行,sed替換命令如下: ? ? ? ? ?DOS轉UNIX:$ sed ‘s/.$//’dosfile.txt > unixfile.txt ? ? ? ? ?UNIX轉DOS:$ sed ’s/$/\r/’unixfile.txt > dosfile.txt 2.5 使用Perl ? ? ? ? ?Perl是相當直接,你添加或刪除掉文件每行結尾的CR字符。 ? ? ? ? ?DOS轉UNIX:perl -p -e ‘s/\r$//’< dosfile.txt > unixfile.txt ? ? ? ? ?UNIX轉DOS:perl -p -e ‘s/$/\r/’< unixfile.txt > dosfile.txt 總結 ? ? ? ? ?還有其它DOS和UNIX文本文件的轉換方法,我個人推薦使用vim命令。但是,對于大型的文件,推薦使用perl工具,你也不希望在vim或Emacs中打開幾個G的文本文件。 |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設備網 版權所有 |