บนระบบปฏิบัติการที่เหมือนยูนิกซ์ sdiff คำสั่งเปรียบเทียบไฟล์สองไฟล์แบบเคียงข้างกัน เลือกรวมไฟล์เหล่านั้นแบบโต้ตอบ และส่งออกผลลัพธ์
หน้านี้ครอบคลุมเวอร์ชัน GNU/Linux ของ sdiff.
คำอธิบาย
sdiff ทำการเปรียบเทียบความแตกต่างระหว่าง .เคียงข้างกัน FILE1 และ FILE2และเลือกที่จะรวมเข้าด้วยกัน (ดูที่ -o ตัวเลือกด้านล่าง)
หากหนึ่งใน ไฟล์ ถูกกำหนดเป็นเส้นประ (“–“), sdiff อ่านจากอินพุตมาตรฐาน
ไวยากรณ์
sdiff [OPTION]... FILE1 FILE2
ตัวเลือก
-o ไฟล์, –output=ไฟล์ |
รวมไฟล์แบบโต้ตอบและส่งผลลัพธ์ไปที่ ไฟล์. การระบุตัวเลือกนี้จะเริ่มต้นการเปรียบเทียบแบบเคียงข้างกัน และให้คุณอยู่ที่ “%” พร้อมถามวิธีรักษาความต่าง กด เข้า ที่พรอมต์เพื่อดูตัวเลือกการรวมซึ่งมีดังนี้:
เมื่อการผสานเสร็จสิ้น เนื้อหาที่ผสานจะถูกเขียนไปที่ ไฟล์. |
||||||||||||||||||||
-ผม, –ละเว้นกรณี | ใช้อักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กราวกับว่าเป็นตัวเดียวกัน | ||||||||||||||||||||
-E, –ignore-tab-expansion |
ละเว้นการเปลี่ยนแปลงเนื่องจากการขยายแท็บ (โดยที่แท็บถูกขยายเป็นช่องว่างหรือช่องว่าง) | ||||||||||||||||||||
-NS, –ignore-space-change |
ละเว้นการเปลี่ยนแปลงในจำนวนช่องว่าง (ช่องว่าง แท็บ ฯลฯ) | ||||||||||||||||||||
-W, –ignore-all-space | ละเว้นพื้นที่สีขาวทั้งหมด | ||||||||||||||||||||
-NS, –ignore-blank-lines | ละเว้นการเปลี่ยนแปลงที่มีบรรทัดว่างทั้งหมด | ||||||||||||||||||||
-ผม NS, –ignore-matching-lines=NS |
ละเว้นการเปลี่ยนแปลงซึ่งทุกบรรทัดตรงกับนิพจน์ทั่วไป NS. | ||||||||||||||||||||
–สตริป-ต่อท้าย-cr | ถอดแคร่ต่อท้ายที่ป้อนกลับ | ||||||||||||||||||||
-NS, –ข้อความ | ถือว่าไฟล์ทั้งหมดเป็นไฟล์ข้อความ | ||||||||||||||||||||
-w NUM, –ความกว้าง=NUM | เอาต์พุตสูงสุด NUM (ค่าเริ่มต้น 130) พิมพ์คอลัมน์ | ||||||||||||||||||||
-l, –left-คอลัมน์ | ส่งออกเฉพาะคอลัมน์ด้านซ้ายของบรรทัดทั่วไป | ||||||||||||||||||||
-NS, –suppress-common-lines | อย่าส่งออกบรรทัดทั่วไป | ||||||||||||||||||||
-NS, –ขยายแท็บ | ขยายแท็บเป็นช่องว่างในผลลัพธ์ | ||||||||||||||||||||
–tabsize=NUM | ตั้งค่าแท็บหยุดที่ทุก NUM (ค่าเริ่มต้น 8) พิมพ์คอลัมน์ | ||||||||||||||||||||
-NS, –ขั้นต่ำ | พยายามอย่างหนักเพื่อค้นหาการเปลี่ยนแปลงเล็กๆ น้อยๆ | ||||||||||||||||||||
-ชม, –speed-ขนาดใหญ่-ไฟล์ | สมมติว่าไฟล์ขนาดใหญ่ (ซึ่งมีการเปลี่ยนแปลงเล็กน้อยกระจัดกระจายจำนวนมาก) | ||||||||||||||||||||
–diff-program=โปรแกรม | ใช้ โปรแกรม เพื่อเปรียบเทียบไฟล์. | ||||||||||||||||||||
–ช่วย | แสดงข้อความช่วยเหลือและออก | ||||||||||||||||||||
-v, –รุ่น | ข้อมูลเวอร์ชันเอาต์พุตและการออก |
การแสดงความแตกต่างแบบเคียงข้างกัน
sdiff สร้างรายการความแตกต่างแบบเคียงข้างกันของทั้งสองไฟล์ เนื้อหาของไฟล์จะแสดงเป็นสองคอลัมน์โดยมี “รางน้ำ” คั่นกลาง รางน้ำมีหนึ่งในเครื่องหมายต่อไปนี้:
ช่องว่าง | บรรทัดที่สอดคล้องกันมีเหมือนกัน นั่นคือ เส้นใดเส้นหนึ่งเหมือนกัน หรือความแตกต่างถูกละเว้นเนื่องจากตัวใดตัวหนึ่ง –ละเว้นตัวเลือก (ดู: การจัดการความแตกต่างของช่องว่างสีขาว ด้านล่าง) |
| | บรรทัดที่สอดคล้องกันต่างกัน และทั้งสองบรรทัดนั้นสมบูรณ์หรือไม่สมบูรณ์ทั้งคู่ |
< | ไฟล์ต่างกันและมีเพียงไฟล์แรกเท่านั้นที่มีบรรทัด |
> | ไฟล์ต่างกันและมีเพียงไฟล์ที่สองเท่านั้นที่มีบรรทัด |
( | เฉพาะไฟล์แรกที่มีบรรทัด แต่ส่วนต่างจะถูกละเว้น |
) | เฉพาะไฟล์ที่สองเท่านั้นที่มีบรรทัด แต่ส่วนต่างจะถูกละเว้น |
บรรทัดที่สอดคล้องกันแตกต่างกัน และมีเพียงบรรทัดแรกเท่านั้นที่ไม่สมบูรณ์ | |
/ | บรรทัดที่สอดคล้องกันแตกต่างกัน และมีเพียงบรรทัดที่สองเท่านั้นที่ไม่สมบูรณ์ |
โดยปกติ บรรทัดเอาต์พุตจะไม่สมบูรณ์ก็ต่อเมื่อบรรทัดที่มีอยู่นั้นไม่สมบูรณ์เท่านั้น อย่างไรก็ตาม เมื่อบรรทัดผลลัพธ์แสดงถึงบรรทัดที่แตกต่างกันสองบรรทัด หนึ่งอาจไม่สมบูรณ์ในขณะที่อีกบรรทัดหนึ่งไม่สมบูรณ์ ในกรณีนี้ สายส่งออกจะสมบูรณ์ แต่รางน้ำมีเครื่องหมาย ““หากบรรทัดแรกไม่สมบูรณ์”/” ถ้าบรรทัดที่สองคือ
บางครั้งรูปแบบเคียงข้างกันอาจอ่านง่ายที่สุด แต่ก็มีข้อจำกัด มันสร้างเอาต์พุตที่กว้างกว่าปกติมาก และตัดการแสดงบรรทัดที่ยาวเกินไปที่จะพอดี นอกจากนี้ ยังอาศัยการจัดวางเอาต์พุตให้หนักกว่าปกติ ดังนั้นเอาต์พุตจึงดูแย่เป็นพิเศษหากคุณใช้แบบอักษรที่มีความกว้างต่างกัน แท็บหยุดที่ไม่ได้มาตรฐาน หรืออักขระที่ไม่ได้พิมพ์
การจัดการความแตกต่างของพื้นที่สีขาว
NS –ignore-tab-expansion (-E) ตัวเลือกละเว้นความแตกต่างระหว่างแท็บและช่องว่างในการป้อนข้อมูล แท็บจะถือว่าเทียบเท่ากับจำนวนช่องว่างในการหยุดแท็บถัดไป
NS –ignore-ต่อท้ายช่องว่าง (-Z) ตัวเลือกละเว้นช่องว่างสีขาวที่ท้ายบรรทัด
NS –ignore-space-change (-NS) ตัวเลือกแข็งแกร่งกว่า -E และ -Z รวมกัน โดยจะละเว้นช่องว่างสีขาวที่ปลายบรรทัด และถือว่าลำดับอื่นๆ ทั้งหมดของอักขระช่องว่าง 1 ตัวหรือมากกว่าภายในบรรทัดนั้นเท่ากัน ด้วยตัวเลือกนี้ sdiff ถือว่าสองบรรทัดต่อไปนี้เทียบเท่ากัน โดยที่ ‘$‘ หมายถึงปลายบรรทัด:
Here lyeth muche rychnesse in lytell space. -- John Heywood$ Here lyeth muche rychnesse in lytell space. -- John Heywood $
NS –ignore-all-space (-w) ตัวเลือกยังแข็งแกร่งกว่า โดยจะละเว้นความแตกต่างแม้ว่าบรรทัดหนึ่งจะมีช่องว่างสีขาวโดยที่อีกบรรทัดหนึ่งไม่มี อักขระช่องว่าง ได้แก่ แท็บ แท็บแนวตั้ง การป้อนแบบฟอร์ม การขึ้นบรรทัดใหม่ และการเว้นวรรค บางสถานที่อาจกำหนดอักขระเพิ่มเติมให้เป็นช่องว่าง ด้วยตัวเลือกนี้ sdiff ถือว่าสองบรรทัดต่อไปนี้เทียบเท่ากัน โดยที่ ‘$‘ หมายถึงปลายบรรทัดและ ‘^เอ็ม‘ หมายถึงการคืนรถ:
Here lyeth muche rychnesse in lytell space.-- John Heywood$ He relyeth much erychnes seinly tells pace. --John Heywood ^M$
สำหรับโปรแกรมอื่น อักขระขึ้นบรรทัดใหม่ถือเป็นอักขระช่องว่าง แต่ sdiff เป็นโปรแกรมที่เน้นบรรทัดและอักขระขึ้นบรรทัดใหม่จะลงท้ายบรรทัดเสมอ ดังนั้น -w หรือ –ignore-all-space ตัวเลือกไม่ละเว้นการเปลี่ยนแปลงที่เกี่ยวข้องกับการขึ้นบรรทัดใหม่ จะละเว้นการเปลี่ยนแปลงพื้นที่สีขาวอื่น ๆ เท่านั้น
ผสานแบบโต้ตอบ
หากคุณระบุไฟล์เอาต์พุตโดยใช้คำสั่ง -o ตัวเลือก, sdiff แสดงความแตกต่างแบบเคียงข้างกันในกลุ่มของบรรทัดที่ต่างกัน และแจ้งให้คุณทราบ (“%“) ที่คุณสามารถเลือกวิธีจัดการกับความแตกต่างเพื่อสร้างไฟล์เอาต์พุตที่ผสานเป็นกรณีๆ ไป
ตัวอย่างเช่น สมมติว่าเรามีไฟล์สองไฟล์ cat.c และ cat2.cแสดงเคียงข้างกันที่นี่:
cats.c: cats2.c: /* │ /* cats, a program. │ "cats", a computer program. Tells you if your cat is alive or dead. │ Tells you if your cat is alive or dead. by E. Schrödinger. │ by E. Schrödinger. */ │ */ │ #include <stdio.h> │ #include <stdio.h> #include <stdlib.h> │ #include <stdlib.h> #include <time.h> │ #include <time.h> │ int main () { │ int main () { │ double numCats; │ /* seed pseudorandomizer */ double chance = (double)rand(); │ srand( time( NULL ) ); │ chance = chance / (double)RAND_MAX; │ double numCats; │ double chance = (double)rand(); if ( chance > 0.5 ) { │ printf("Felix is alive.n"); │ chance = chance / 1; } else if ( chance < 0.5 ) { │ printf("Felix is not alive.n"); │ if ( chance > 0.5 ) { } else { │ printf("My cat is alive.n"); printf("Felix is alive and dead.n"); │ } else if ( chance < 0.5 ) { } │ printf("My cat is dead.n"); } │ } else { │ printf("My cat might be alive.n"); │ } │ }
ไฟล์ทั้งสองมีความแตกต่างกัน และเราต้องตัดสินใจว่าจะเก็บไฟล์ใดไว้ มาวิ่งกันเถอะ sdiff ในสองไฟล์โดยระบุไฟล์เอาต์พุตso sdiff รู้ว่าเราต้องการทำการผสานด้วย:
sdiff -o merged_cats.c cats.c cats2.c
sdiff ส่งออกไปยังหน้าจอ:
/* /* cats, a program. | "cats", a computer program.
ในที่นี้ เราจะเห็นสองบรรทัดแรกของไฟล์ของเรา — บรรทัดที่สองมีความแตกต่าง ดังนั้น sdiff หยุดอยู่ที่นั่นและแจ้งให้เราทราบ (“%“). แถบแนวตั้ง (“|“) อยู่ในสิ่งที่เรียกว่า “รางน้ำ” – ช่องว่างที่คั่นระหว่างสองบรรทัด – และหมายความว่าทั้งสองบรรทัด “เข้าแถว” นั่นคือตำแหน่งในไฟล์ที่เกี่ยวข้องกัน ถ้าเรากด เข้า ที่พรอมต์ sdiff ให้รายการคำสั่งสั้น ๆ แก่เรา:
ed: Edit then use both versions, each decorated with a header. eb: Edit then use both versions. el or e1: Edit then use the left version. er or e2: Edit then use the right version. e: Discard both versions then edit a new one. l or 1: Use the left version. r or 2: Use the right version. s: Silently include common lines. v: Verbosely include common lines. q: Quit.
ตัวเลือกทั้งหมดที่ขึ้นต้นด้วย อี (เอ็ด, เอบฯลฯ) เปิดตัวแก้ไข (เอ็ด หรือ viโดยค่าเริ่มต้น) และอนุญาตให้เราแก้ไขบรรทัดด้วยตนเองเพื่อแก้ไขความแตกต่าง เช่น หากเราป้อนคำสั่ง เอ็ด ที่ % พรอมต์:
%ed
…เราเห็นสิ่งต่อไปนี้ในตัวแก้ไขของเรา:
--- cats.c 2 cats, a program. +++ cats2.c 2 "cats", a computer program.
นี่เป็นไฟล์ชั่วคราวที่แสดงสองบรรทัดที่แตกต่างกันของเรา “ตกแต่งด้วยส่วนหัว”: บรรทัดจากไฟล์ 1 มีสามขีด (“—“) ชื่อไฟล์และหมายเลขบรรทัด บรรทัดจากไฟล์ 2 มีเครื่องหมายบวกสามตัว (“+++“) ชื่อไฟล์และหมายเลขบรรทัด ส่วนหัวควรถูกลบ และอีกสองบรรทัดที่เหลือควรแก้ไขเป็นบรรทัดเดียวซึ่งแสดงถึงการรวมด้วยตนเองของคุณ เมื่อคุณเขียนไฟล์ชั่วคราวและออกจากโปรแกรมแก้ไข sdiff แก้ไขความแตกต่างด้วยสิ่งที่คุณบันทึกไว้ (รวมถึงส่วนหัวหากคุณไม่ลบออก ดังนั้นอย่าลืมทำ) ถ้าคุณไม่เขียนการเปลี่ยนแปลงใดๆ sdiff ใช้ส่วนหัวและบรรทัดที่ไม่เปลี่ยนแปลงเป็นความละเอียด ดังนั้นตรวจสอบให้แน่ใจว่าคุณได้แก้ไขและเขียนการเปลี่ยนแปลง
หรือจะเลือกก็ได้ l (L ตัวพิมพ์เล็ก) หรือ NS เพื่อเลือกบรรทัดจากไฟล์ 1 หรือไฟล์ 2 ตามลำดับ ในกรณีนี้ สมมติว่าเราต้องการบรรทัดจากไฟล์ 2 ดังนั้นเราจะพิมพ์ NS.
%r
sdiff ดำเนินการผ่านไฟล์ โดยขอให้เราแก้ไขความแตกต่างทุกครั้งที่พบ:
Tells you if your cat is alive or dead. Tells you if your cat is alive or dead. by E. Schrödinger. by E. Schrödinger. */ */ #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <stdlib.h> #include <time.h> #include <time.h> int main () { int main () { > /* seed pseudorandomizer */ > srand( time( NULL ) ); >
นี่ทั้งสาม”>” สัญลักษณ์ในรางน้ำ ก่อนสามบรรทัดสุดท้ายด้านขวา บอกเราว่าบรรทัดเหล่านี้ปรากฏในไฟล์ 2 แต่ไม่ใช่ไฟล์ 1 หากเราป้อน l (L ตัวพิมพ์เล็ก) บรรทัดเหล่านี้จะถูกลบออกจากบล็อกของบรรทัดนี้ ถ้าเราเข้าไป NSพวกเขาจะเก็บไว้ มาเก็บไว้กันเถอะ:
%r
ชุดถัดไปจะปรากฏขึ้น:
double numCats; double numCats; double chance = (double)rand(); double chance = (double)rand(); chance = chance / (double)RAND_MAX; | chance = chance / 1;
แถบแนวตั้งในรางน้ำในบรรทัดสุดท้ายบอกเราว่าทั้งสองเวอร์ชันของบรรทัดที่สอดคล้องกันต่างกันและต้องได้รับการแก้ไข ในการวิเคราะห์อย่างใกล้ชิด อันด้านซ้ายในไฟล์ 1 เป็นเวอร์ชันของบรรทัดที่เราต้องการเก็บไว้ ดังนั้นเราจะพิมพ์ l ที่พรอมต์:
%l
ชุดถัดไปจะปรากฏขึ้น:
if ( chance > 0.5 ) { if ( chance > 0.5 ) { printf("Felix is alive.n"); | printf("My cat is alive.n");
นี่มันเรื่องของความชอบ ให้เวอร์ชันอยู่ทางขวา:
%r
และอื่นๆ จนถึงส่วนท้ายของไฟล์:
} else if ( chance < 0.5 ) { } else if ( chance < 0.5 ) { printf("Felix is not alive.n"); | printf("My cat is dead.n");
%r
} else { } else { printf("Felix is alive and dead.n"); | printf("My cat might be alive.n");
ไม่มีความแตกต่างอีกต่อไป ดังนั้น sdiff พิมพ์บรรทัดที่เหลือของไฟล์ และกลับมาที่พรอมต์คำสั่งเชลล์
มาดูไฟล์ที่ผสานของเรากัน:
cat merged_cats.c
/* "cats", a computer program. Tells you if your cat is alive or dead. by E. Schrödinger. */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { /* seed pseudorandomizer */ srand( time( NULL ) ); double numCats; double chance = (double)rand(); chance = chance / (double)RAND_MAX; if ( chance > 0.5 ) { printf("My cat is alive.n"); } else if ( chance < 0.5 ) { printf("My cat is dead.n"); } else { printf("My cat might be alive.n"); } }
อย่างที่คุณเห็น ตัวเลือกของเรารวมอยู่ในไฟล์ที่ผสาน และเวอร์ชันที่เราละทิ้งนั้นถูกละทิ้ง
ตัวแปรสภาพแวดล้อม
สองตัวแปรสภาพแวดล้อมที่เกี่ยวข้องมากที่สุดซึ่งส่งผลกระทบ sdiff (นอกเหนือจากการตั้งค่าสถานที่ เช่น LC_ALL) เป็น บรรณาธิการ และ ภาพ ตัวแปร สิ่งเหล่านี้ระบุตัวแก้ไขและตัวแก้ไข “ภาพ” ที่คุณต้องการใช้เป็นค่าเริ่มต้นเมื่อแก้ไขไฟล์ ตัวแปรเหล่านี้ควรตั้งค่าเป็นพาธแบบเต็มของเอดิเตอร์ที่คุณชื่นชอบ เช่น /usr/bin/vim สำหรับ เป็นกลุ่ม. ถ้าไม่รู้ว่าที่ไหน เป็นกลุ่ม ตั้งอยู่ ลอง ที่ สั่งการ:
which vim
/usr/bin/vim
ใน ทุบตีคุณสามารถตั้งค่าตัวแปรและส่งออกได้ดังนี้:
EDITOR=/usr/bin/vim; export EDITOR
sdiff ตอนนี้ใช้ค่าของตัวแปรนี้เมื่อเรียกใช้ตัวแก้ไขในระหว่างการผสานแบบโต้ตอบ
ถ้าไม่ใช่ บรรณาธิการ ก็ไม่เช่นกัน ภาพ มีการกำหนด sdiff ค่าเริ่มต้นเป็น เอ็ด หรือ vi (อาจจะ เอ็ด).
ถ้า ทั้งสอง บรรณาธิการ และ ภาพ มีการกำหนด ภาพ แทนที่ บรรณาธิการ.
ตัวอย่าง
sdiff file1.txt file2.txt
เปรียบเทียบไฟล์ file1.txt และ file2.txt เคียงข้างกัน โดยแสดงความแตกต่างในเอาต์พุตมาตรฐาน
sdiff - < file1.txt file2.txt
ในการกำหนดค่าคำสั่งนี้ sdiff เปรียบเทียบข้อความที่ได้รับจากอินพุตมาตรฐานซึ่งในกรณีนี้คือเนื้อหาของ file1.txt และ file2.txt.
sdiff ไม่สามารถทำการผสานแบบโต้ตอบได้เมื่อแหล่งข้อมูลมาจาก stdin
sdiff -o output.txt file1.txt file2.txt
ทำการผสานแบบโต้ตอบของ file1.txt และ file2.txt. ความแตกต่างจะแสดงเป็นบล็อกพร้อมบริบทตั้งแต่บรรทัดแรกของไฟล์จนถึงบรรทัดสุดท้าย sdiff เตือนคุณทุกครั้งที่ต้องการให้คุณตัดสินใจว่าจะดำเนินการใดเพื่อแก้ไขความแตกต่าง กด เข้า ที่ % พร้อมต์สำหรับสูตรโกงของคำสั่งที่เป็นไปได้ หรืออ้างอิงคำอธิบายคำสั่งด้านบนในหน้านี้สำหรับข้อมูลเพิ่มเติม
เมื่อถึงจุดสิ้นสุด sdiff เขียนไฟล์ที่ผสานตามการตัดสินใจของคุณไปยังชื่อไฟล์ที่ระบุ output.txt.
คำสั่งที่เกี่ยวข้อง
แตกต่าง — ระบุความแตกต่างระหว่างสองไฟล์
เอ็ด — โปรแกรมแก้ไขข้อความอย่างง่าย
อดีต — โหมดตัวแก้ไขบรรทัดของ vi โปรแกรมแก้ไขข้อความ
vi — โปรแกรมแก้ไขข้อความตามโหมดภาพของ อดีต.
เป็นกลุ่ม — เวอร์ชันขั้นสูงของ vi.