2009-10-05 96 views
10

我試圖做與this question相反的操作,用Windows行結尾替換Unix行尾,以便我可以use SQL Server bcp over samba to import the file。我已安裝sed,但不是dos2unix。我試圖扭轉這些例子,但無濟於事。在Unix文件中用 r n替換 n

這是我使用的命令。

sed -e 's/\n/\r\n/g' myfile 

我執行該然後跑到od -c myfile,期待看到\r\n那裏曾經是\n。但是,仍然有所有\n。 (或者至少它們看起來像。od的輸出溢出了我的屏幕緩衝區,所以我不能看到文件的開頭)。

我一直無法弄清楚我做錯了什麼。有什麼建議麼?

+0

您沒有編譯器可用? –

+0

什麼樣的編譯器? –

+0

看到文件的頂部: od -c filename |少於 –

回答

11
  • 什麼是越來越dos2unix在機器上的問題?
  • 你正在使用什麼平臺?
  • 你有GNU sed還是普通的非GNU sed

在Solaris,/usr/bin/sed要求:

sed 's/$/^M/' 

其中I通過鍵入控制V控制中號輸入的 '^ M'。 '$'匹配在行的末尾,並用控制-M替換行的末尾。你也可以編寫腳本。

期望sed將'\r'或'\\r'擴展爲控制-M的機制最好是平臺特定的。

+0

這個伎倆。我可能會在那裏獲得dos2unix,但我希望能使用現有的軟件。我在AIX上。我認爲這是非GNU版本。現在你提到它,我已經在vi之前使用過控制-v控制-m技巧了,應該想到這一點。謝謝。 –

-1

也許你試試這樣

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

會的工作,從我的理解你只是使得替換到控制檯輸出,你需要輸出重定向到一個文件,在這種情況下myfile.win,那麼你可以將它重命名爲任何你想要的。整個腳本會(目錄全此類文件的內部運行):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1。不適合我。 – Peter

+0

井是具體平臺,Jonathan Leffler的答案是更好的 – Juparave

3

你不需要-e選項。

$與末尾字符匹配。這sed命令將插入行的末尾之前\r字符:

sed 's/$/\r/' myfile 
+1

感謝您的建議,但由於某種原因,這只是在文件的末尾附加一個r。 –

+0

根據GNU sed的信息手冊:「這裏介紹的所有轉義符都是GNU擴展名,\ n除外」「。 – hlovdal

+0

我沒有指定Unix風格。我正在使用AIX。 +1是第一個指出我應該搜索$而不是\ n。 –

13

當面對這個問題,我用一個簡單的perl的一行:

perl -pi -e 's/\n/\r\n/' filename 

因爲sed行爲會有所不同,我知道這工作。

+0

是的,這是最好的便攜式選擇。上面手工輸入的^ M和不可靠的\ r擴展是showstoppers。 –

1

只要添加一個\r(又名^M,看到喬納森·萊弗勒的答案)在\n前面是不是安全的,因爲文件可能有混合模式EOL,所以後來你可能會在某些行becomming \r\r\n結束了。首先刪除所有'\ r'字符,然後在\n之前插入(單個)\r

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

更新爲使用^M

0

嘗試使用:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

這樣可以確保只有當之前\ n不\ r插入\ r。這對我有效。