Unix ผลต่างจากด้านหนึ่งไปอีกด้านหนึ่ง?


106

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

    diff /tmp/test1  /tmp/test2
1,4c1,2
< asfdsadf
< asdfsad
< fsaf
< fdsadf
---
> asdfsafdsf
> saf
6,8d3
< sadf
< asdf
< sadf
10d4
< fasd
12,13c6,14
< sadfa
< fd
---
> sadf
> sadf
> sadf
> sadf
> sadf
> sadf
> sadf
> sadf
> safa

ฉันต้องการสิ่งที่ชอบ:

diff /tmp/test1  /tmp/test2
1,4c1,2
< asfdsadf       > asdfsafdsf
< asdfsad        > saf       
< fsaf
< fdsadf
---
6,8d3
< sadf
< asdf
< sadf
10d4
< fasd
12,13c6,14
< sadfa               > sadf
< fd              > sadf
---               > sadf
              > sadf
              > sadf
              > sadf
              > sadf
              > sadf
              > safa

vimdiff สามารถช่วยได้เช่นกัน โชคดี.
เปลือกหอย

คำตอบ:


168

จากman diffนั้นคุณสามารถใช้-yทำเคียงข้างกัน

-y, --side-by-side
       output in two columns

ดังนั้นพูดว่า:

diff -y /tmp/test1  /tmp/test2

ทดสอบ

$ cat a                $ cat b
hello                  hello
my name                my name
is me                  is you

ลองเปรียบเทียบดู:

$ diff -y a b
hello                                                           hello
my name                                                         my name
is me                                                         | is you

39
โปรดทราบว่าdiffมีความกว้างเอาต์พุตสูงสุดแบบฮาร์ดโค้ด (130 คอลัมน์) เพิ่มตัวเลือก diff --width=$COLUMNSเพื่อตั้งค่าเป็นความกว้างเทอร์มินัลของคุณ
ntc2

6
นอกจากนี้สำหรับความแตกต่างขนาดใหญ่เพียงแค่ทำให้ท่อน้อยลงเพื่อความแตกต่างแบบdiff -y /tmp/test1 /tmp/test2 | less
เลื่อน

ตรวจสอบ colordiff
Vladislavs Dovgalecs

5
ดีกว่าdiff --width=$COLUMNS --suppress-common-lines --side-by-side a b
rubo77

@ rubo77 ทั้งนี้ขึ้นอยู่กับวิธีที่คุณตั้งค่าการขยายแท็บคุณอาจต้องการขยายแท็บไปยังช่องว่างเพื่อให้เอาต์พุตเรียงแถวในคอลัมน์อย่างถูกต้อง:diff --expand-tabs --width=$COLUMNS --suppress-common-lines --side-by-side a b
EdwardTeach

40

จากหน้าแรกของ icdiff :

ใส่คำอธิบายภาพที่นี่

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

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

IMHO diff -yผลผลิตของมันคือการอ่านได้มากขึ้นกว่า


29
diff -y --suppress-common-lines file1 file2

3
นี่ควรเป็นคำตอบที่ยอมรับได้เพราะเพียงแค่-yแสดงบรรทัดทั่วไปเช่นกันซึ่งไม่เหมือนกับdiffคำถามเดิม +1.
เกลียว

ดีกว่าdiff -W $COLUMNS --suppress-common-lines -y file1 file2
rubo77

13

คุณสามารถใช้ได้:

sdiff  file1 file2

หรือ

diff -y file1 file2

หรือ

vimdiff file1 file2

สำหรับการแสดงผลแบบเคียงข้างกัน


2
ฉันสงสัยว่าอะไรคือความแตกต่างระหว่างdiff -yและsdiff? ผลลัพธ์ของพวกเขาดูเหมือนกับฉัน
Hux

11

คุณควรมีsdiffสำหรับการผสานความแตกต่างของไฟล์แบบเคียงข้างกัน อ่านman sdiffเรื่องเต็ม


2
ในระบบของฉัน (GNU / Linx) sdiffดูเหมือนจะทำสิ่งเดียวกันกับdiff -yและsdiffเอกสารข้อมูลบอกว่าเลิกใช้แล้ว: "'sdiff' without '--output' ('-o') จะสร้างความแตกต่างแบบเคียงข้างกันการใช้งานนี้ ล้าสมัยแล้วให้ใช้ตัวเลือก '--side-by-side' ('-y') ของ 'diff' แทน "
ntc2

7

คุณสามารถใช้:

diff -y fileA.txt fileB.txt | colordiff

แสดงผลลัพธ์ที่แยกออกเป็นสอง colum และ colorized! ( colordiff)


1
เพิ่งลองบน OSX และใช้งานไม่ได้ที่นี่ อาจเป็นสำหรับ linux เท่านั้น
Nikola Petkanski

colordiff ไม่ได้อยู่ใน osx
terry franguiadakis

คุณสามารถติดตั้งcolordiffบน OSX โดยใช้สูตรHomebrew brew install colordiff ดูcolordiff
Jorge Fernando Matricali


6

ลองcdiff - ดูสีที่แตกต่างเพิ่มขึ้นในพื้นที่ทำงานหรือจาก stdin พร้อมเคียงข้างกันและรองรับเพจเจอร์อัตโนมัติ



4

หากไฟล์ของคุณมีการใช้ช่องว่างและแท็บที่ไม่สอดคล้องกันคุณอาจพบว่าการรวม-tอาร์กิวเมนต์เพื่อขยายแท็บนั้นเป็นประโยชน์:

diff -ty file1 file2

1

คำสั่ง diff ขั้นสูงพร้อมสีเคียงข้างกันและนามแฝง

สมมติว่าเนื้อหาของไฟล์เป็นดังนี้:

cat /tmp/test1.txt
1
2
3
4
5
8
9

และ

cat /tmp/test2.txt
1
1.5
2
4
5
6
7

ตอนนี้เปรียบเทียบแบบเคียงข้างกัน

diff --width=$COLUMNS --suppress-common-lines --side-by-side --color=always /tmp/test1.txt /tmp/test2.txt
                                                                              > 1.5
3                                                                             <
8                                                                             | 6
9                                                                             | 7

คุณสามารถกำหนดนามแฝงที่จะใช้

alias diff='diff --width=$COLUMNS --suppress-common-lines --side-by-side --color=always'

จากนั้นผลต่างใหม่:

diff /tmp/test1.txt /tmp/test2.txt
                                                                              > 1.5
3                                                                             <
8                                                                             | 6
9                                                                             | 7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.