diff รายงานสองไฟล์แตกต่างกันแม้ว่าจะเหมือนกัน!


31

ฉันมีสองไฟล์ซึ่งมีลักษณะเหมือนกันกับฉัน (รวมถึงช่องว่างต่อท้ายและบรรทัดใหม่) แต่ต่างกันว่าพวกเขาต่างกัน แม้ว่าฉันจะทำการdiff -yเปรียบเทียบแบบเคียงข้างกันเส้นก็จะเหมือนกันทุกประการ เอาต์พุตจาก diff เป็นไฟล์ทั้ง 2 ไฟล์

ความคิดใดที่ทำให้เกิดมัน


3
ลองเปรียบเทียบอักขระที่ไม่สามารถพิมพ์ได้ sed -n l filenameวิธีที่ง่ายที่สุดในการดูพวกเขาคือ หากไม่ช่วยให้เพิ่มตัวอย่างข้อมูลและdiffส่งออกที่นี่
เร่ง

1
อ่าใช่ขอบคุณบรรทัดในไฟล์ลงท้ายด้วย $ และอีกอันลงท้ายด้วย \ r $
MinaHany

1
การแก้ไขอย่างรวดเร็วคือการใช้ dos2unix ทั้งไฟล์ (หรือไฟล์ที่คุณสงสัยว่ามาจากเครื่อง Windows)
chembrad

ในฐานะที่เป็นส่วนเติมเต็มให้กับคำตอบที่มีอยู่: fileคำสั่งจะแนะนำคุณเกี่ยวกับเนื้อหาไฟล์รวมถึงสิ่งต่างๆเช่นASCII text, with CRLF line terminatorsvsASCII text VS
Stéphane Gourichon

คำตอบ:


29

แปลก .. คุณลองได้cmpไหม คุณอาจต้องการใช้-bตัวเลือก '' ด้วย

หน้าคน cmp - เปรียบเทียบสองไฟล์ไบต์โดยไบต์

นี่เป็นหนึ่งในสิ่งที่ดีเกี่ยวกับ Unix / Linux .. เครื่องมือมากมาย :)


2
ขอบคุณสำหรับสิ่งนั้น! ฉันได้รับ: ไบต์ 19, บรรทัดที่ 1 คือ 15 ^ M 12 ^ J มันหมายความว่าอะไร?
MinaHany

3
ดูเหมือนว่าการขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่ตามตารางนี้
Levon

2
พยายาม -b กับ diff และดูเหมือนว่าจะทำงานให้ฉัน หน้าคนกล่าวว่าสำหรับ-b ignore changes in the amount of white space
rahul.deshmukhpatil

17

ความแตกต่างอาจเกิดจากจุดจบของ DOS vs. UNIX หรืออะไรทำนองนี้?

ถ้าคุณhexdumpพวกเขา สิ่งนี้อาจแสดงความแตกต่างที่ชัดเจนยิ่งขึ้นเช่น:

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

Hexes ทั้งสองนั้นแตกต่างกัน ทุกครั้งที่มี 0d 0a ในไฟล์ส่วนอีกอันเพิ่งมี 0a
MinaHany

3
ในหนึ่งคุณมีจุดสิ้นสุดบรรทัด DOS (CRLF) และอีกหนึ่งจุดสิ้นสุดบรรทัด UNIX (LF) นั่นเป็นสาเหตุที่ทำให้พวกเขาดูแตกต่าง แต่ไม่ใช่เมื่อคุณมองด้วยสายตา ดูen.wikipedia.org/wiki/Newline#Conversion_utilities
mrb

เข้าใจแล้ว! ขอบคุณมาก. คำแนะนำของ Levon ในการใช้ cmp แสดงให้เห็นถึงความแตกต่างที่ชัดเจนยิ่งขึ้น :)
MinaHany

17

ลอง:

diff file1 file2 | cat -t

-tตัวเลือกที่จะทำให้เกิดcatการแสดงตัวอักษรพิเศษใด ๆ อย่างชัดเจน - เช่น ^Mสำหรับ CR ^Iสำหรับแท็บ

จากหน้าคน (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

การเดาครั้งแรกของฉันซึ่งปรากฎว่าได้รับการยืนยันคือไฟล์ใช้การสิ้นสุดบรรทัดที่แตกต่างกัน อาจเป็นความแตกต่างอื่น ๆ ในช่องว่างเช่นการปรากฏตัวของช่องว่างต่อท้าย (แต่คุณมักจะไม่ได้รับว่าในหลายบรรทัด) หรือเยื้องที่แตกต่างกัน (แท็บ vs ช่องว่าง) ใช้คำสั่งที่พิมพ์ช่องว่างและอักขระควบคุมในรูปแบบที่มองเห็นได้เช่น

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

คุณสามารถยืนยันได้ว่าความแตกต่างนั้นเกี่ยวข้องกับการจบบรรทัดโดยการทำให้เป็นปกติก่อน คุณอาจมีdos2unixโปรแกรมอรรถประโยชน์ ถ้าไม่ใช่ให้ลบอักขระพิเศษ CR (^ M, \ r, \ 015) อย่างชัดเจน:

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

หรือถ้าfile1เป็นสิ่งหนึ่งที่มีตอนจบ DOS

 tr -d '\r' <file1 | diff - file2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.