2011-04-27 43 views
2

當我從excel的窗口中保存一個TSV文件時,它使用\ r或\ 015(八進制)的行結尾,它在vi中顯示爲^ M。如何更改Linux中的Windows或Mac文件的文件結尾?

當我從excel保存Mac上的TSV文件時,它使用以\ r \ n或\ 015 \ 012(八進制)結尾的行作爲^ M顯示在vi中。

我該如何處理更改這兩個文件的行結尾而不添加額外的空白行,但仍然保持linux兼容的行尾?

我目前使用PHP的exec()來運行以下命令:

如果我使用:

cat {FILE} | tr -d "\015" > {NEW_FILE} 

cat {FILE} | tr -d "\r" > {NEW_FILE} 

Windows的Works文件,但Mac文件失敗。 (刪除所有行尾)

如果我使用:

cat {FILE} | tr "\015" "\012" > {NEW_FILE} 

cat {FILE} | tr "\r" "\n" > {NEW_FILE} 

作品爲Mac文件,但Windows文件的失敗。 (創建空行)

任何想法如何處理在同一例程內?

+0

試過** sed **? 'sed -e's/$/\ r /'unix-format.txt> win-format.txt' – 2011-04-27 15:48:45

+0

它適用於Windows,但不適用於Mac。我需要一個適用於任何文件的解決方案。 – 2011-04-27 16:03:33

+0

那麼,你可以嘗試一個腳本,讀取第一行+ 1個字符,看看它是以\ r還是\ r \ n結尾,然後在你自己的'轉換器代碼'中進行相應的處理。像這樣,你可以堅持純PHP和第三方依賴。 – 2011-04-28 07:29:11

回答

1

我想我找到了一個優雅的解決方案來解決這個問題。在我的PHP腳本中,我創建了以下內容:

$results = exec("cd $directory; grep -Pl $'\r\n' $filename"); 
if($results == $filename) { 
    // Windows File (default) 
    exec("cd $directory; cat $filename | tr -d '\015' > $tmpfile; mv $tmpfile $filename");  
} else { 
    // MAC File 
    exec("cd $directory; cat $filename | tr '\r' '\n' > $tmpfile; mv $tmpfile $filename"); 
} 

如果有人有改進之處,我願意改進。

0

用於windows文件的dos2unix和用於mac文件的mac2unix。

+0

再次...我無法訪問服務器上的這些實用程序。他們沒有安裝,也不能。 – 2011-04-27 17:00:23

相關問題