diff แสดงความแตกต่างภายในบรรทัดเท่านั้น


9

ฉันต้องการเปรียบเทียบบรรทัดในสองไฟล์ แต่เพื่อลดจุดรบกวนในเอาต์พุตฉันต้องการเฉพาะความแตกต่างที่แท้จริงในบรรทัดที่จะพิมพ์

ตัวอย่างเช่นกำหนดสองไฟล์ด้านล่าง:

a.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z

b.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z

(ความแตกต่างระหว่างพวกเขาเป็นกรณีของจดหมายb)

ฉันต้องการผลลัพธ์ที่ต้องการ:

[-b-]{+B+}

ปัจจุบันแนวทางที่ดีที่สุดที่ฉันพบคือใช้git diff --word-diffแต่มันให้ผลลัพธ์ทั้งบรรทัด:

a [-b-]{+B+} c d e f g h i j k l m n o p q r s t u v w x y z

มีวิธีทำโดยตรงมากกว่าวิธีแยกวิเคราะห์ด้วยตนเองหรือไม่? นอกจากนี้ฉันควรจะใช้สิ่งที่มีอยู่มากกว่าgit diffปกติเช่นเครื่องมือเชลล์ POSIX ที่ไม่ต้องการให้ผู้ใช้ติดตั้งแพ็คเกจเพิ่มเติม


มันคงจะดีถ้าคุณใช้ตัวอย่างที่เห็นความแตกต่างได้ชัดเจนขึ้น ฉันต้องเหล่เพื่อดูว่าตัวละครทั้งสองนั้นไม่เหมือนกัน
Barmar

ขออภัยฉันได้เพิ่มบันทึกอธิบายความแตกต่างระหว่างบรรทัด
Anol

ทำไมไม่ใช้เพียงbและBดังนั้นจึงเป็นเรื่องที่เห็นได้ชัด? ฉันเข้าใจว่านี่อาจเป็นความแตกต่างที่แท้จริง แต่สำหรับวัตถุประสงค์ของคำถามที่คุณสามารถทำให้ง่ายขึ้น
Barmar

1
ฉันต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ใช้งานได้กับอักขระ ASCII เท่านั้น แต่เนื่องจากโซลูชันที่เสนอไม่ได้ขึ้นอยู่กับตัวฉันจึงเปลี่ยน อย่างไรก็ตามฉันไม่สามารถอัปเดตคำตอบเพื่อสะท้อนการเปลี่ยนแปลงใหม่ได้เนื่องจากการแก้ไขจะมีขนาดเล็กกว่า 6 ตัวอักษร
Anol

คำตอบ:


14

ใช้wdiff :

$ wdiff -3 a.txt b.txt

======================================================================
 [-b-] {+B+}
======================================================================

-3หรือ---no-commonตัวเลือกที่จะลบคำที่มีร่วมกันระหว่างสองไฟล์และแสดงเฉพาะความแตกต่าง

===...แบนเนอร์ (และบรรทัดว่างเปล่า) อาจจะถูกลบออกด้วยgrep:

$ wdiff -3 a.txt b.txt | grep -vx '=*'
 [-b-] {+B+}

wdiffอาจอ่านdiffข้อมูลรวมถ้าคุณให้มัน-dหรือ--diff-inputตัวเลือกตัวอย่างเช่นจากgit:

git diff somefile | wdiff -d -3

แม้ว่าwdiffจะไม่ใช่เครื่องมือ POSIX แต่โดยทั่วไปจะมีอยู่


อาจเป็นเรื่องน่าสังเกตว่าถ้าเทอร์มินัลของคุณรองรับการหลบหนี ANSI คุณสามารถทำให้การพิมพ์ wdiff สีแฟนซีที่ (imo) ง่ายต่อการอ่านด้วย bashrc ของคุณ: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(นำมาจากที่นี่ )
scohe001
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.