ความแตกต่างในช่องว่างระหว่างสองไฟล์บน Linux


15

ฉันมีสองไฟล์ที่เมื่อเปรียบเทียบกับ diff แสดงว่าทุกบรรทัดเปลี่ยนไป เมื่อฉันเปรียบเทียบกับdiff -w(ไม่สนใจช่องว่าง) จะแสดงการเปลี่ยนแปลงเล็กน้อยที่ฉันคาดหวัง

เห็นได้ชัดว่ามีความแตกต่างระหว่างช่องว่างในแต่ละไฟล์ แต่ฉันไม่รู้ว่าพวกมันคืออะไรหรือจะหาได้อย่างไร ฉันได้ลองแก้ไขไฟล์เพื่อให้แน่ใจว่าช่องว่างเป็นตัวอักษรเว้นวรรค (ตรงข้ามกับแท็บ) แต่ฉันไม่แน่ใจว่าจะต้องทำอะไร

ฉันใช้เสียงเรียก:set list onเข้าเพื่อยืนยันว่าไม่มีช่องว่างท้ายท้ายบรรทัด

ฉันยังเชื่อว่าแต่ละไฟล์มีตัวยุติบรรทัด Linux เนื่องจากกลุ่มไม่แสดง^Mในตอนท้ายของบรรทัด


1
คุณได้ตรวจสอบช่องว่างท้ายท้ายบรรทัดแล้วหรือยัง? พื้นที่ดังกล่าวจะถูกตรวจพบโดยdiffผู้แก้ไขหลายคนจะไม่สามารถมองเห็นพื้นที่ได้ตามค่าเริ่มต้น
John1024

คำแนะนำที่ดี ฉันใช้เสียงเรียกเข้ากับ ": set list on" สิ่งนี้แสดงให้เห็นถึง "$" ที่ท้ายบรรทัดและไม่มีพื้นที่ต่อท้าย ฉันจะอัปเดตคำถามของฉัน
Romski

หากคุณเป็นvimผู้ใช้คุณลองใช้vimdiff file1 file2เพื่อดูว่ามีความแตกต่างอะไรบ้าง
John1024

@ John1024 ฉันไม่รู้ vimdiff แต่มันก็ดูดี เพิ่มเป็นคำตอบและฉันจะยอมรับ
Romski

1
Vim จะแสดง ^ M เฉพาะเมื่อตรวจพบการสิ้นสุดบรรทัด Unix แต่ไฟล์นั้นมีการลงท้ายด้วย DOS จริง สิ่งนี้มักจะเกิดขึ้นหากคุณมีการผสมบรรทัดที่ลงท้ายด้วยไฟล์เดียวเช่นการใช้โปรแกรมปะแก้ที่มีการลงท้ายบรรทัดต่างจากไฟล์ต้นฉบับ เมื่อเสียงเรียกเข้าตรวจพบเส้น DOS ที่สิ้นสุดลงอย่างถูกต้องจะไม่แสดง ^ M
Lie Ryan

คำตอบ:


7

สำหรับvimผู้ใช้มีประโยชน์สำหรับแสดงความแตกต่างที่แน่นอนระหว่างไฟล์:

vimdiff file1 file2

การทำเช่นนี้จะทำให้แต่ละไฟล์อยู่ในหน้าต่างเคียงข้างกันและความแตกต่างโดยเน้นด้วยสี

คำสั่งที่มีประโยชน์บางอย่างเมื่ออยู่ใน vimdiff

ในขณะที่vimdiffคำสั่งที่มีประโยชน์คือ:

  • ]c: ข้ามไปยังการเปลี่ยนแปลงต่อไป

  • [c: ข้ามไปยังการเปลี่ยนแปลงก่อนหน้า

  • ctrl-W ctrl-W: สลับไปที่หน้าต่างอื่น

  • zo: เปิดฝาพับ

  • zc: พับปิด

ตัวอย่าง

นี่คือตัวอย่างของvimdiffการxtermเปรียบเทียบcupsไฟล์กำหนดค่าสองเวอร์ชัน:

ป้อนคำอธิบายรูปภาพที่นี่

คุณจะเห็นว่าส่วนที่ยาวของบรรทัดที่เหมือนกันนั้นถูกยุบ zoพวกเขาสามารถเปิดได้อีกครั้งกับ

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


14

บน FreeBSD หรือระบบ Linux ส่วนใหญ่คุณสามารถไพพ์เอาต์พุตของ diff ผ่านcat -v -e -tเพื่อแสดงความแตกต่างของช่องว่าง

diff file1 file2 | cat -vet

แท็บจะแสดงเป็น^Iที่$จะแสดงในตอนท้ายของแต่ละบรรทัดเพื่อให้คุณสามารถเห็นต่อท้ายช่องว่างและอักขระ nonprinting จะแสดงเป็นหรือ^XM-X

ถ้าคุณมี coreutils ของ GNU (มีอยู่ในการกระจายลีนุกซ์แบบ non-busybox ส่วนใหญ่), สิ่งนี้สามารถทำให้ง่ายขึ้น

diff file1 file2 | cat -A

ในระบบ busybox catv -vetใช้


2

เป็นหนึ่งในไฟล์ที่ถูกแก้ไขบนเครื่อง Windows หรือไม่?

การยกเลิกบรรทัดมาตรฐานบน Windows คือ CRLF โดยที่ Linux เป็นเพียง LF (และบน Mac ที่เคยเป็น CR แต่ฉันสงสัยว่ามันเปลี่ยนไปนับตั้งแต่ OS X)

ลองใช้wc -lไฟล์และดูว่ามีกี่บรรทัดจากนั้นดูว่าขนาดแตกต่างกันเท่ากับจำนวนบรรทัดหรือไม่ (บรรทัดสุดท้ายอาจไม่สิ้นสุดในไฟล์เดียว)


ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว การนับจำนวนบรรทัดแสดงว่าไฟล์หนึ่งไฟล์มีอีก 5 บรรทัด (ฉันคาดว่าจะเป็นสิ่งนี้เนื่องจากฉันได้ทำการแก้ไขแล้ว) ฉันได้หนึ่งไฟล์จากเครื่องลีนุกซ์และอีกอันถูกเช็กเอาต์จากที่เก็บรหัสลงบนลีนุกซ์ ฉันเชื่อว่าการดูไฟล์ด้วย Windows terminators ในกลุ่มจะแสดงอักขระตัวสุดท้ายเป็น ^ M และไม่ใช่ในกรณีนี้
Romski

3
เสียงเรียกเข้านั้นฉลาดพอที่จะตรวจจับการยุติบรรทัดโดยอัตโนมัติดูstackoverflow.com/questions/3852868สำหรับรายละเอียด
fencepost

ฉันไม่ได้ตระหนักถึงสิ่งนั้น! ฉันจะตรวจสอบอีกครั้ง
Romski

2

odอาจช่วย คำสั่ง Octal Dump สามารถแสดงเนื้อหาเป็นเลขฐานสิบหก สิ่งนี้จะช่วยให้คุณเห็นว่าไบต์ใดรวมถึง null null หรือ white space ที่ไม่คาดคิดอยู่ในไฟล์ สาเหตุทั่วไปที่เป็นไปได้อาจเป็น LF กับ CRLF แท็บเทียบกับช่องว่างหรือ ASCII vs Unicode (ซึ่งอาจมีเพียง null ไบต์ก่อนแต่ละไบต์ที่มองเห็นได้ตามปกติ) od -x filenameควรเปิดเผยรูปแบบใด ๆ เหล่านั้น หากคุณต้องการวิธีการดูไฟล์ที่ละเอียดยิ่งขึ้น "ตัวแก้ไข hex" ใด ๆ อาจทำได้ดี สิ่งที่ดีเกี่ยวกับodมันคือเช่นเดียวกับcutคำสั่งมันถูกสร้างขึ้นในระบบ Unix จำนวนมาก ดังนั้นบ่อยครั้งที่ไม่จำเป็นต้องติดตั้งแยกต่างหาก

หากคุณต้องการไฟล์ที่คล้ายกันมากขึ้นtrสามารถทำการเปลี่ยนแปลงบางอย่างและsedสามารถทำเพิ่มเติมได้ ฉันอาจเริ่มต้นด้วยls -lการดูไฟล์ที่มีขนาดใหญ่กว่าจากนั้นดูไบต์เพื่อดูว่าต้องเปลี่ยนอะไรแล้วเปลี่ยนหนึ่งในไฟล์เพื่อให้ดูเหมือนกัน


1

หากต้องการทราบว่าคุณสามารถแทนที่ whitespaces และแท็บใดได้บ้างโดยใช้sedตัวอย่าง:

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

และตอนนี้เปรียบเทียบไฟล์สองไฟล์


ยิ่งไปกว่านั้นคุณสามารถเรียกใช้ตัวกรองนั้นบนเอาต์พุต diff หรือคุณสามารถใช้ตัวกรองสำเร็จรูปcatเช่นเดียวกับในsuperuser.com/a/913368/37154
clacke

0

เนื้อหาต่อไปนี้ถูกคัดลอกมาที่นี่จากส่วน "คำถาม" ด้านบนซึ่งเขียนโดย Romski

ทั้งสองvimdiffและdiff file1 file2 | cat -Aมีประโยชน์มากจากมุมมองของเครื่องมือ

ท้ายสุดฉันพบปัญหาอีกหนึ่งข้อ ไฟล์ของฉันบางไฟล์ถูกเข้ารหัสด้วย UTF-8 BOM diff file1 file2 | cat -Aนี้เป็นไฮไลต์โดยใช้ สิ่งนี้ประจักษ์เองM-oM-;M-?ที่จุดเริ่มต้นของไฟล์ที่ได้รับผลกระทบ:

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

ในขณะที่มีปัญหาจำนวนหนึ่งฉันได้แสดงรายการคำสั่งด้านล่างสำหรับผู้ที่ต้องการล้างไฟล์ของพวกเขา:

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.