2013-10-16 56 views
16

我有一個文件中這一行:刪除^從文件M字符使用sed的

ULNET-PA,client_sgcib,broker_keplersecurities 
,KEPLER 

我試圖擺脫的那個^ M(回車)字符,所以我用:

sed 's/^M//g' 

但是這並不之後^ M去掉一切:

[[email protected] tmp]# vi test 
ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER 

[[email protected] tmp]# sed 's/^M//g' test 
ULNET-PA,client_sgcib,broker_keplersecurities 

我想獲得的是:

[[email protected] tmp]# vi test 
ULNET-PA,client_sgcib,broker_keplersecurities,KEPLER 
+0

爲什麼不在表達式中使用'\ n'或'\ r \ n'? –

+1

@fedorqui它不是字面意義上的「^」和「M」,而是「^ M」,IIRC,稱爲「控制字符」。 – Jite

+0

使用$ tr -d'\ 015' file2; mv file2 file1 – 42n4

回答

38

使用tr

tr -d '^M' < inputfile 

(注意^M字符可以是使用Ctrl + V鍵Ctrl + M鍵輸入)


編輯:由於suggestedGlenn Jackman,如果你使用的是bash,你也可以這樣說:

tr -d $'\r' < inputfile 
+1

+1爲最簡單的解決方案。另請注意,您可以在tr中使用八進制代碼,例如'tr -d'\ 012''來刪除換行符。你可以使用'od -bc inputfile'來瀏覽什麼代碼意味着文件中的內容和位置。 –

+0

另見'dos2unix' ... – twalberg

+1

@twalberg我覺得'dos2unix'只會從行尾刪除CR。這個問題中的例子並不能說明它是否只存在於行的末尾。 – devnull

10

仍然是相同的路線:

sed -i 's/^M//g' file 

當你輸入這個命令,^M鍵入按Ctrl + V按Ctrl + M

其實如果你已經打開的文件在vim中,你可以在vim中:

:%s/^M//g 

相同,^M鍵入Ctrl-V Ctrl-M

+1

只需按住Ctrl並按V然後M – user3439968

+0

OP說他想要一個使用'sed'的解決方案。 –

+0

使用$ tr -d'\ 015' file2; mv file2 file1 – 42n4

4
alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' " 

用法:

dos2unix file 
+0

你怎麼可以在沒有別名的shell腳本中使用這個命令?不斷讓sed抱怨一些語法....像\ 015字符vs^M – bjm88

+0

@ bjm88這樣的解決方案我發現這個地方:'sed's,'$'\ 015'''' – glormph

0

@twalberg(見accepted answer comments,以上)同意,在Mac OSX DOS2UNIX的涵蓋這一點,引用man dos2unix

要在Mac模式下運行,請使用命令行選項「-c mac」或使用 命令「mac2unix」或「unix2m AC」

我看中了 'mac2unix',這擺脫了我的少-CMD可見 '^ M' 的條目,由Apple '留言' 2優山美地(OSX 10.10)之間轉移的bash腳本的介紹Mac電腦!

我使用流行的Homebrew軟件包安裝程序在Mac OSX上安裝了'dos2unix',我強烈推薦它和它的配套命令Cask

3

您可以簡單地使用在大多數Unix/Linux系統中可用的dos2unix。但是我發現下面的sed命令會更好,因爲它去掉^ M其中DOS2UNIX的不能:

sed 's/\r//g' <input.txt> output.txt 

希望有所幫助。

注:^ M是在代碼中表示爲\ r實際上回車符 做什麼DOS2UNIX的是最有可能等同於:

sed 's/\r\n/\n/g' <input.txt> output.txt 

它不會刪除\ r時,它立即不然後是\ n,並用\ n來替換它們。這與某些類型的文件(如我剛剛測試的文件)失敗。

+0

很好的解釋! Thnks! –

+0

的確,很好的解釋。對於dos2unix失敗的任何實例,您的方法似乎工作正常。 – tasslebear

3

如果Perl是一個選項:

perl -i -pe 's/\r\n$/\n/g' file

-i使得輸入文件的版本.bak的
\r =回車
\n =換行符
$ =行結束
s/foo/bar/g =用「bar」全局替換「foo」

+0

愛perl,工作得很好:) – Deano

+0

我如何使用相同的perl腳本。 'test.pl' – dhpratik

+0

#!/ usr/bin/perl open IN,「<」,shift; 打開OUT,「>」,shift; while(){ s/\ r \ n $/\ n/g; print OUT; (IN); } close(IN); close(OUT); –

1

在AWK:

sub(/\r/,"") 

如果是在記錄的結尾,sub(/\r/,"",$NF)應該足夠了。無需掃描整個記錄。