diff báo cáo hai tập tin khác nhau, mặc dù chúng giống nhau!


31

Tôi có hai tệp trông giống hệt tôi (bao gồm cả khoảng trắng và dòng mới) nhưng diff vẫn cho biết chúng khác nhau. Ngay cả khi tôi làm một diff -yso sánh cạnh nhau, các dòng trông giống hệt nhau. Đầu ra từ diff là toàn bộ 2 tập tin.

Bất cứ ý tưởng những gì gây ra nó?


3
Cố gắng so sánh các ký tự không thể in. Cách đơn giản nhất để xem chúng là sed -n l filename. Nếu nó không hữu ích, hãy thêm một ví dụ dữ liệu và diffđầu ra ở đây.
vội vàng

1
À vâng cảm ơn bạn, các dòng trong một tệp đang kết thúc bằng $ và trong một dòng khác kết thúc bằng \ r $
MinaHany

1
Cách khắc phục nhanh là sử dụng dos2unix trên cả hai tệp (hoặc tệp bạn nghi ngờ là từ máy Windows).
chembrad

Là một bổ sung cho câu trả lời hiện có: các filelệnh sẽ gợi ý với bạn về nội dung tập tin, bao gồm những thứ như ASCII text, with CRLF line terminatorsvs ASCII text.
Stéphane Gourichon

Câu trả lời:


29

Lạ .. bạn có thể thử cmpkhông? Bạn cũng có thể muốn sử dụng -btùy chọn ''.

Trang man cmp - So sánh hai tệp byte theo byte.

Đây là một trong những điều hay về Unix / Linux .. rất nhiều công cụ :)


2
Cảm ơn vì điều đó! Tôi đã nhận: byte 19, dòng 1 là 15 ^ M 12 ^ J có nghĩa là gì?
MinaHany

3
trông giống như vận chuyển trở lại và cho ăn theo bảng này
Levon

2
đã thử -b với diff và nó dường như đang hoạt động với tôi. trang người đàn ông nói -blà cho ignore changes in the amount of white space.
rahul.deshmukhpatil

17

Có thể sự khác biệt được gây ra bởi kết thúc dòng DOS và UNIX, hoặc một cái gì đó tương tự?

Nếu bạn là hexdumphọ thì sao? Điều này có thể cho thấy sự khác biệt rõ ràng hơn, ví dụ:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex

Vâng, hai hình lục giác là khác nhau. mỗi khi có 0d 0a trong một tệp thì người khác chỉ có 0a
MinaHany

3
Trong một, bạn có các kết thúc dòng DOS (CRLF) và trong các kết thúc dòng UNIX khác (LF). Đó là lý do tại sao chúng trông khác biệt nhưng không phải khi bạn nhìn chúng một cách trực quan. Hãy xem en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb

Hiểu rồi! Cảm ơn rất nhiều. Mặc dù đề xuất sử dụng cmp của Levon cho thấy sự khác biệt rõ ràng hơn :)
MinaHany

17

Thử:

diff file1 file2 | cat -t

Các -ttùy chọn sẽ gây ra catđể hiển thị bất kỳ ký tự đặc biệt rõ ràng - ví dụ. ^Mcho CR, ^Icho tab.

Từ trang người đàn ông (OS X):

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.

4

Dự đoán đầu tiên của tôi, hóa ra được xác nhận, là các tệp sử dụng các kết thúc dòng khác nhau. Nó có thể là một số khác biệt khác trong khoảng trắng, chẳng hạn như sự hiện diện của khoảng trắng theo dõi (nhưng bạn thường không nhận được điều đó trên nhiều dòng) hoặc thụt lề khác nhau (tab so với khoảng trắng). Sử dụng lệnh in ra khoảng trắng và các ký tự điều khiển ở dạng hiển thị, chẳng hạn như

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

Bạn có thể xác nhận rằng sự khác biệt chỉ có liên quan đến kết thúc dòng bằng cách chuẩn hóa chúng trước. Bạn có thể có một dos2unixtiện ích; nếu không, hãy xóa rõ ràng ký tự CR (^ M, \ r, \ 015):

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

hoặc, nếu file1là một trong những kết thúc DOS

 tr -d '\r' <file1 | diff - file2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.