2011-12-19 32 views
2

我試圖比較文件忽略回車 - 其他任何unix diff -b表現令人欽佩。但在這個AIX 5.3盒子上:AIX diff -b破解?

tst1:tst2$ od -c testfile 
0000000 t h i s \r \n f i l e \r \n h a s \r 
0000020 \n c a r r i a g e \r \n r e t u r 
0000040 n s \r \n 
0000044 
tst1:tst2$ od -c testfile_nocr 
0000000 t h i s \n f i l e \n h a s \n c a 
0000020 r r i a g e \n r e t u r n s \n 
0000037 
tst1:tst2$ diff -b testfile testfile_nocr 
1,5c1,5 
< this 
< file 
< has 
< carriage 
< returns 
--- 
> this 
> file 
> has 
> carriage 
> returns 
tst1:tst2$ 

爲什麼這麼說?

回答

2

AIX 5.3 diff似乎沒有考慮\r作爲空格。請參閱下面的成績單:

/home/pax: od -c file1 
0000000 h e l l o \n t h e r e \n 
0000014 

/home/pax: od -c file2 
0000000 h e l l o \r \n t h e r e \r \n 
0000016 

/home/pax: od -c file3 
0000000 h e l l o  \n t h e r e  \n 
0000016 

/home/pax: od -c file4 
0000000 h e l l o \t \n t h e r e \t \n 
0000016 

/home/pax: diff -b file1 file2 
1,2c1,2 
< hello 
< there 
--- 
> hello 
> there 

/home/pax: diff -b file1 file3 
<<No output>> 

/home/pax: diff -b file1 file4 
<<No output>> 

的聯機幫助頁diff對此事有點鈍,指出-b將「導致在該行的末尾的任意數量的空格被視爲一個換行符。 ..「但實際上並沒有定義它認爲是白色空間。

基於上面的記錄,我會收集空格和製表符都可以,但回車沒有。要解決這個問題

的一種方式將是刪除回車自己與喜歡的腳本:

#!/usr/bin/ksh 
# crdiff: diffs two files after changing \r\n to \n in both. 
if [[ $# -ne 2 ]] ; then 
    echo 'Usage: crdiff <file> <file2>' 
    return 1 
fi 
perl -pne 's/\r$//' $1 >/tmp/xyzzy_$$_$1 
perl -pne 's/\r$//' $2 >/tmp/xyzzy_$$_$2 
diff -b /tmp/xyzzy_$$_$1 /tmp/xyzzy_$$_$2 
rc=$? 
rm -f /tmp/xyzzy_$$_$1 /tmp/xyzzy_$$_$2 
return $rc 

或者,你可以編譯你的盒子的GNU diff實用性和/usr/bin之前將其插入路徑 - 作爲空格,\r似乎沒有問題。實際上,我們在我們的AIX4盒子上做的確如此,因爲diff甚至沒有假裝來支持-b選項。

+0

似乎有點沉重的東西,可以用'tr -d'\ r''完成...... :) – sarnold 2011-12-19 03:40:22

+0

@sarnold:是的,有可能有十幾種其他方式來做到這一點,我的代碼更多一個樣品。順便說一句,我認爲'tr'將會刪除所有的CRs,而不僅僅是行尾的那些,但是,通過所有的方式,使用最簡單的工具就可以完成這項工作。 – paxdiablo 2011-12-19 03:50:27

+0

嘿,我從來沒有在其他地方看過CR,所以這個想法從來沒有超過我的想法。 :D – sarnold 2011-12-19 21:28:32