2012-09-20 32 views
11

我發現我的許多文件都有DOS行結尾。在VI中它們看起來像這樣:「^ M」。 我不想修改沒有這些DOS行結尾的文件。我如何使用bash腳本來做到這一點?謝謝!在Ubuntu上查找並刪除DOS行結尾

EV

回答

18
grep -URl ^M . | xargs fromdos 

的grep讓你有DOS行結束當前目錄下的所有文件的列表。

-U使得grep的考慮行結尾,而不是默認

-R剝他們離開使得遞歸

-l使得它僅列出文件名和不匹配的行

那麼你就管道該列表轉換器命令(這是在Ubuntu的fromdosdos2unix我來自哪裏)。

注意:實際上沒有鍵入^M。相反,你需要按<Ctrl-V>然後<Ctrl-M>來插入^M字符,並讓grep明白你要做什麼。或者,你可以輸入$'\r'代替^M(但我認爲這可能只適用於bash ...)。

+1

grep -URL^M。 | xargs fromdos? – Dalinaum

+5

用於安裝的Ubuntu軟件包被稱爲「tofrodos」。 – Apalala

+0

在tcsh上,也可能在csh上,你可以用'grep -URl「\ r獲得同樣的效果。 | xargs fromdos'。 – bdesham

0

,你可以使用命令:

dos2ux file.in>file.out or: 
在Perl

perl -pi -e 's/\r//g' your_file 

或者你可以這樣做:

  • 開在六
  • 進入到命令模式
  • :%s/[ctrl-V][CTRL-M]//g
0

注意,如果你將多字節文件,你需要採取額外的照顧,並且應該嘗試使用正確的iconv或recode編碼規範。

如果它是一個普通的ASCII文件,下面的兩個方法都可以工作。

flip該程序在Debian中也被稱爲flip,可以處理行尾。從手冊:

When asked to convert a file to the same format that it already 
has, flip causes no change to the file. Thus to convert all 
files to **IX format you can type 

flip -u * 

and all files will end up right, regardless of whether they were 
in MS-DOS or in **IX format to begin with. This also works in the 
opposite direction. 

或者你可以使用GNU轉碼:

< /etc/passwd recode ..pc | tee a b > /dev/null 
file a b 

輸出:

a: ASCII text, with CRLF line terminators 
b: ASCII text, with CRLF line terminators 

轉換爲Unix行結束符:

recode pc.. a b 
file a b 

輸出:

a: ASCII text 
b: ASCII text 

重新編碼簡寫DOS行結束作爲pc,所以用pc..所述邏輯:從PC格式轉換爲默認值,即與latin1的UNIX行結束。

3

在Ubuntu上,您使用fromdos實用

fromdos test.txt 

上面的例子將採取一個MS-DOS或Microsoft Windows文件或其他文件不同的行分隔符和格式化新的行分隔符的文件在Linux和Unix中閱讀。

2

一個使用GNU coreutils方式:

< file.txt tr -d '\r' 
0

的修改到贏取的答案,如果你需要通過結束

grep -URl ^M . | grep .php | xargs dos2unix 

我用DOS2UNIX的,而不是fromdos但效果應該是文件過濾相同。