ความเข้าใจในการส่งออกต่าง


87

ฉันมี file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

และ file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

ถ้าฉัน: diff file1.txt file2.txtฉันได้รับ:

3d2  
< line3  
5a5  
> GNU is not UNIX  

โดยทั่วไปแล้วเอาต์พุตจะตีความอย่างไร ฉันคิดว่านั่น<หมายถึงการลบออก แต่สิ่งที่ทำ3d2หรือ5a5หมายความว่าอย่างไร

ถ้าฉันทำ:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

ผลลัพธ์มีความชัดเจนมากขึ้น แต่@@ -1,5 +1,5 @@หมายความว่าอย่างไร

คำตอบ:


96

ในdiffเอาต์พุตแรกของคุณ(เรียกว่า "normall diff") ความหมายมีดังนี้

< - หมายถึงบรรทัดใน file1.txt

> - หมายถึงบรรทัดใน file2.txt

3d2และ5a5แสดงถึงหมายเลขบรรทัดที่ได้รับผลกระทบและการกระทำใดที่ถูกดำเนินการ dย่อมาจากการลบaหมายถึงการเพิ่ม (และcหมายถึงการเปลี่ยนแปลง) หมายเลขทางด้านซ้ายของอักขระคือหมายเลขบรรทัดใน file1.txt หมายเลขด้านขวาคือหมายเลขบรรทัดใน file2.txt ดังนั้น3d2บอกคุณว่าบรรทัดที่ 3 ใน file1.txt ถูกลบและมีหมายเลขบรรทัดที่ 2 ใน file2.txt (หรือดีกว่าที่จะบอกว่าหลังจากลบตัวนับบรรทัดกลับไปที่หมายเลขบรรทัด 2) 5a5บอกคุณว่าเราเริ่มจากหมายเลขบรรทัดที่ 5 ใน file1.txt (ซึ่งจริง ๆ แล้วว่างเปล่าหลังจากที่เราลบบรรทัดในการกระทำก่อนหน้า) เพิ่มบรรทัดและบรรทัดที่เพิ่มนี้คือหมายเลข 5 ใน file2.txt

เอาต์พุตของdiff -uคำสั่งถูกจัดรูปแบบแตกต่างกันเล็กน้อย (เรียกว่ารูปแบบ "unified diff") ที่นี่diffแสดงให้เราเห็นชิ้นส่วนของข้อความแทนที่จะเป็นสองข้อความแยกกัน ในบรรทัด@@ -1,5 +1,5 @@ส่วน-1,5เกี่ยวข้องกับ file1.txt และส่วนที่+1,5เป็น file2.txt พวกเขาบอกเราว่าdiffจะแสดงข้อความหนึ่งข้อความซึ่งมีความยาว 5 บรรทัดเริ่มจากหมายเลขบรรทัด 1 ใน file1.txt และเช่นเดียวกันกับ file2.txt - diffแสดงให้เราเห็น 5 บรรทัดโดยเริ่มจากบรรทัดที่ 1

ดังที่ฉันได้กล่าวไปแล้วบรรทัดจากทั้งสองไฟล์จะแสดงร่วมกัน

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

ที่นี่-แสดงถึงบรรทัดที่ถูกลบออกจาก file1.txt และ+แสดงถึงบรรทัดที่ถูกเพิ่ม


25

สรุป :

ที่กำหนดdiff file1 file2, <หมายความว่าสายจะหายไปในfile2และหมายความว่าสายจะหายไปใน> และสามารถปฏิเสธพวกเขามีคำสั่งสำหรับซึ่งมักจะถูกนำมาใช้กับfile13d25a5patchdiff

คำตอบแบบเต็ม :

ยูทิลิตี้ * nix จำนวนมากมีคู่มือ TeXinfo รวมถึงmanหน้าเว็บที่เรียบง่ายกว่า คุณสามารถเข้าถึงเหล่านี้โดยการทำงานเช่นinfo command info diffในกรณีนี้ส่วนที่คุณสนใจคือ:

2.4.2 คำอธิบายโดยละเอียดของรูปแบบปกติ


รูปแบบเอาต์พุตปกติประกอบด้วยความแตกต่างอย่างน้อยหนึ่งอย่าง ก้อนใหญ่แต่ละอันจะแสดงพื้นที่หนึ่งที่ไฟล์ต่างกัน รูปแบบปกติ hunks มีลักษณะเช่นนี้:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

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

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been

4

ฉันแนะนำให้ใช้:

diff -rupP file1.txt file2.txt > result.patch

จากนั้นเมื่อคุณอ่านresult.patchคุณจะรู้ความแตกต่างทันที

นี่คือความหมายของสวิตช์บรรทัดคำสั่ง:

-r : เรียกซ้ำ

-u : แสดงหมายเลขบรรทัด

-p (เล็ก): แสดงความแตกต่างในฟังก์ชั่น C

-P (ตัวพิมพ์ใหญ่): ในกรณีที่มีหลายไฟล์เส้นทางแบบเต็มจะปรากฏขึ้น


3

คำตอบข้างต้นเป็นสิ่งที่ดี อย่างไรก็ตามในฐานะผู้เริ่มต้นฉันพบว่าพวกเขาเข้าใจยากเล็กน้อยและเมื่อค้นหาเพิ่มเติมฉันพบลิงค์ที่มีประโยชน์มาก: Linux Command Command & ตัวอย่าง

เว็บไซต์อธิบายแนวคิดในลักษณะที่เรียบง่ายและเข้าใจง่าย

คำสั่ง Diff นั้นง่ายต่อการเข้าใจถ้าคุณพิจารณาด้วยวิธีนี้:

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

แต่ละกรณีต่อไปนี้อธิบายได้ดี:

a สำหรับเพิ่ม, c สำหรับการเปลี่ยนแปลง, d สำหรับลบ


2

เปลี่ยนชื่อสิ่งต่าง ๆ เพื่อช่วยให้คุณจำได้!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

ผลลัพธ์จะทำงานบนไฟล์ต่อการแก้ไข (file1) โดยใช้การอัปเดตต่างๆ


ความคล้ายคลึงกันฉันพบว่าการเปลี่ยนชื่อเหล่านี้มีประโยชน์ในการกำหนดผลลัพธ์:

ลบ = 'ลบ' & เพิ่ม = 'แทรก'

2,4d1 --- D (s) - d -N --- d elete (' ลบ ') D บรรทัด จากนั้นซิงค์ที่บรรทัด N ทั้งคู่

4a2,4 --- N- -U (s) --- ที่บรรทัด N, DD ( ' แทรก ') สายการปรับปรุงของ (s) U

หมายเหตุ: พวกมันเกือบจะสมมาตรแล้ว


Change = 'remove & insert'

2,4c5,6 --- R (s) - c -U (s) --- ลบบรรทัด R (s) แล้วใส่บรรทัดที่อัพเดท U (s) ในสถานที่ของพวกเขา



ตัวอย่างเช่น:

4a2,4 --- เริ่มต้นที่ 4 เพิ่มบรรทัดที่อัปเดต 2-4 (เช่น 2,4 หมายถึง 2, 3 และ 4)

2,4d1 --- ลบบรรทัด 2-4

2,4c5,6 --- ลบบรรทัด 2-4 และแทรกบรรทัดที่อัพเดต 5-6


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

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