2010-09-22 45 views
4

我知道我可以通過使用「flip -u」(cygwin flip)來修復它們,它基本上刪除了其中一個0xd,使用DOS樣式行尾(0x0d 0x0a)(當然,從技術上講,這可能被認爲是一個bug!)。如何用MIXED行結尾找到/修復文件(0x0d 0x0d 0x0a)

但是另一方面,我想選擇性地做這件事,確保我正在修復的是一個「非二進制」文件,並明確用0x0d 0x0a代替0x0d 0x0d 0x0a序列。沒有運行看起來像我想要的(也可能更多)的錯誤程序。

請注意,grep -P'\ x0d \ x0d \ x0a'和grep -P'\ x0d \ x0d'找不到這些行。

雖然人們說的grep -P「X0D \ X0A」被正確找到行結束,我不得不猜測,別的東西是怎麼回事,因爲它不能在混合行尾文件匹配其他模式(0x0d 0x0d 0x0a)。

回答

2

這裏有一個簡單的方法來識別包含混合行結尾的文件:

cat -A $FILE | grep '\^M\^M\$' 

-A意味着-v-E,其中包括行尾和其他隱藏字符。例如,我們創建一個測試文件。我會相當接近實際使用的文字來表示與行結尾,你會看到:

$ od -x test1.txt 
0000000 6464 2061 0d20 0a0d 6464 6161 2020 0d0d 
0000020 0a0a 6164 2020 0a0d 
0000030 

現在讓我們來看看貓給我們:

$ cat -vE test1.txt 
dda ^M^M$ 
ddaa ^M^M$ 
$ 
da ^M$ 

cat確實向我們展示了CR和LF類(雖然LFS過程中不要在同一行上顯示出來 - 而且名正言順左右),所以現在我們可以找到他們:

find /path -yourPredicatesOfInterest -print | while read fn ; do 
    cat -A $fn | grep '\^M\^M\$' > /dev/null 2>&1 && echo "$fn contains multiple CR CR LFs" 
done 
+0

謝謝,我寄予厚望,但...即使該文件有0x0d 0x0d 0x0a行結尾,貓在行尾顯示^ M $,而不是^ M^M $(Windows/cygwin)。基本上0x0d 0x0d 0x0a混合似乎不適用於已發佈在這個主題上的大多數模式(sed,perl,grep等)! - ( – 2010-09-22 23:23:40

+0

嗯,非混合(DOS)文件cat的結果 - A只是$ ...,現在我需要知道這是否如預期的那樣,或者是我看到的其他程序的另一個變體(例如,儘管\ x0d \ x0a可用於egrep查找行,某些原因\ x0d \ x0d不會找到任何行,所以它就好像程序將這些字符視爲一種特殊情況,而不是對文件中所有字符的文字搜索。就像我說的,我想知道我是字面上的匹配0x0d0x0d0x0a做任何改變 – 2010-09-22 23:31:47

+0

猜是時候編寫我自己的程序了-P – 2010-09-22 23:32:46

0

您可以嘗試BBE(http://bbe-.sourceforge.net/):

bbe -e 's/\x0d\x0d\x0a/\x0a/' 

這將取代以unix行尾結尾的行;或者:

bbe -e 's/\x0d\x0d\x0a/\x0d\x0a/' 

它將用DOS行結尾替換它們。

相關問題