ฉันจะแตกไฟล์กำหนดค่าสองไฟล์ได้อย่างไร


15

ฉันมีไฟล์ snmpd.conf สองไฟล์ไฟล์หนึ่งอยู่บนเซิร์ฟเวอร์ที่ใช้งานได้และไฟล์หนึ่งที่ไม่ได้ ฉันจะแตกไฟล์กำหนดค่าทั้งสองนี้อย่างไรในขณะที่แยกความคิดเห็นที่ไม่เกี่ยวข้องและขึ้นบรรทัดใหม่ได้อย่างไร


1
ระวัง jldugger! คุณกำลังจะไปlevel! =)
Xerxes

เป็นความคิดที่ดีที่จะตัดความคิดเห็นคุณจะรู้ได้อย่างไรว่าพวกเขาไม่เกี่ยวข้องโดยไม่ได้ดูพวกเขา
AnonymousLurker

คำตอบ:


15
diff <(grep -v '^#' f1) <(grep -v '^#' f2)

หากต้องการหลีกเลี่ยงบรรทัดว่างและบรรทัดที่ไม่มีอะไรนอกจากช่องว่างนอกเหนือจากบรรทัดที่เหมือนกันซึ่งมีความแตกต่างเดียวของช่องว่างนำหน้า ...

diff -b \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f2)

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


+1 สำหรับการให้บริการโซลูชั่นบรรทัด
#:

ความคิดเห็นเกี่ยวกับวิธีการละเว้นบรรทัดที่มีช่องว่างเช่นกัน? ปรากฎเมื่อคุณตัดความคิดเห็นมีบรรทัดว่างจำนวนมากที่เว้นระยะห่าง
jldugger

@jldugger ลองอัปเดต grep ให้เป็นเช่นนี้เพื่อแยกความคิดเห็นและช่องว่างออก - egrep -v '^ (#. * |) $'
Zoredache

19

หากคุณค่อนข้างพอใจกับเสียงเรียกเข้าฉันขอแนะนำให้คุณใช้vimdiff :

vimdiff file1 file2

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

จากนั้นหากคุณต้องการผสานความแตกต่างจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งคุณสามารถใช้คำสั่งต่อไปนี้:

(พิจารณาไฟล์ "ปัจจุบัน" เป็นไฟล์ที่เคอร์เซอร์อยู่)

^ W ^ W เพื่อเปลี่ยนโฟกัสจากหน้าต่างของไฟล์หนึ่งเป็นหน้าต่างของไฟล์อื่น

] c เพื่อไปยังบล็อกถัดไปที่มีความแตกต่าง

[c เพื่อย้อนกลับค้นหาบล็อกก่อนหน้านี้ที่มีความแตกต่าง

ทำ ( d iff o btain) เพื่อนำการเปลี่ยนแปลงจากไฟล์อื่นไปยังไฟล์ปัจจุบัน

dp ( d iff p ut) เพื่อส่งการเปลี่ยนแปลงจากไฟล์ปัจจุบันไปยังไฟล์อื่น

หมายเหตุ: ทั้งdoและdpทำงานหากคุณอยู่บนบล็อกหรือเพียงหนึ่งบรรทัดภายใต้บล็อก

มึง ไปยู Ndo

zo เพื่อเปิด / ปิดการซ่อนข้อความ

zcเพื่อพับ / ซ่อนข้อความอีกครั้ง

zrจะเปิดไฟล์ทั้งสองอย่างสมบูรณ์ (การใช้: ช่วยในการพับเพิ่มเติมเกี่ยวกับการพับ)

: diffupdateจะทำการสแกนไฟล์ซ้ำเพื่อหาการเปลี่ยนแปลง

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

เมื่อเสร็จแล้วคุณสามารถออกจากและเขียนไฟล์ทั้งสองด้วย: xa!

นอกจากนี้คุณยังสามารถเขียนออกจากทิ้งการเปลี่ยนแปลง ฯลฯ หนึ่งบานหน้าต่างในเวลาเดียวกับที่คุณมักจะทำกับกลุ่ม

คุณสามารถใช้คำสั่ง vim ทั่วไปเพื่อแก้ไขไฟล์ได้ตามต้องการ ฉันได้อธิบายเฉพาะคำสั่งที่ใช้บ่อยและมีประโยชน์ที่คุณน่าจะใช้ในเซสชัน vimdiff (ซึ่งตรงกันข้ามกับคำสั่งทั่วไปที่เป็นกลุ่ม)


6

Beyond Compare เป็นเครื่องมือที่สุดยอดสำหรับสิ่งนี้!

Link: http://www.scootersoftware.com/

พร้อมใช้งานสำหรับ Windows และ Linux

Jeff เขียนบทความภาพรวมที่ดีเกี่ยวกับเครื่องมือชั่วครู่กลับ:
http://www.codinghorror.com/blog/archives/000454.html


นอกเหนือจากการเปรียบเทียบมันยอดเยี่ยม!
Clinton Blackmore

มีให้ในระบบ * nix หรือไม่
Preet Sangha

นอกเหนือจากเปรียบเทียบ 3 ไม่ทำงานเป็นคอนโซลแอปพลิเคชันบน Linux มันต้องการ X-Windows Linux ที่รองรับ (32 บิต) Red Hat Enterprise Linux 4, 5 Fedora 4 - 10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 ไม่ได้ทดสอบเคอร์เนล Linux 64 บิตใด ๆ ที่เข้ากันได้ Red Hat Enterprise Linux 3
Mark Norgren

ฉันไม่สามารถใช้เครื่องมือนี้ได้อีกต่อไป! ประหยัดเวลาอย่างมาก เมื่อฉันเปลี่ยนจาก PC เป็น Mac ประมาณ 1 ปีที่แล้วฉันดีใจมากที่พบว่าเพิ่งถูกส่งไปยัง Mac ด้วยเช่นกัน
Jpsy

5

เมื่อขยายเป็นหนึ่งซับของ nima คุณสามารถทำเช่นนั้นเป็นฟังก์ชันเชลล์แล้ววางลงใน. bashrc ของคุณ

diff <(grep -v '^#' f1) <(grep -v '^#' f2)

กลายเป็น (โดยใช้ -u เพราะฉันชอบ diffs แบบรวม)

function cleandiff {
  diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}

หากคุณชอบผู้ชม GUI ที่แตกต่างกัน Meld ก็ดีและเข้าใจ dirs / files ที่ควบคุมการแก้ไขแล้ว


+1 สำหรับการรวมซึ่งทำให้การกระจายกราฟิกเป็นเรื่องง่ายยิ่งขึ้น
Avery Payne

4

หลังจากทำความสะอาดความคิดเห็นแล้วฉันจะแนะนำให้ใช้ KDiff3 เป็นเครื่องมือ diff / merge ที่ดีและคุณไม่จำเป็นต้องใช้ vim fu ในการใช้ :)


3

อาจมีวิธีที่สง่างามกว่าที่จะทำ แต่ในทางปฏิบัติ (และรวดเร็ว):

grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean
grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean
diff server1-snmpd.conf-clean server2-snmpd.conf-clean

2

หากคุณใช้เชลล์เหมือนทุบตีคุณสามารถลองทำสิ่งนี้:

# Name this diff-stripped
STRIPPED=
for i in $*; do
    egrep -v "^#|^\s*" "$i" > "$i.stripped"
    STRIPPED="$STRIPPED $i.stripped"
done

diff $STRIPPED

จากนั้นเรียกใช้เช่นนี้:

 diff-stripped file1 file2 ...

นอกจากนี้คุณยังสามารถเปลี่ยนdiffไปvimdiffหรือซึ่งทั้งสองมาพร้อมกับgvimdiffvim


2

การขยายโซลูชันของ Xerxes คุณสามารถใช้เครื่องมือที่ซับซ้อนกว่าdiffการแสดงความแตกต่าง

wdiff

wdiffอาจเป็น "ฉลาดเกินไป" ในบางครั้ง แต่ฉันพบว่ามันมักจะมีประโยชน์สำหรับการมองอย่างรวดเร็วในความแตกต่างระหว่างไฟล์การกำหนดค่า สคริปต์นี้สามารถใช้สำหรับการส่งออกที่มีสี:

#!/bin/bash

RED=$'\e'"[1;31m"
GREEN=$'\e'"[1;32m"
RESET=$'\e'"[0m"
WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps"

wdiff $WDIFF_ARGS \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \
  | less -R

บน Ubuntu และระบบที่ใช้เดเบียนอื่น ๆapt-get install wdiffก่อนที่จะใช้สคริปต์นี้

meld

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

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)

2

บางครั้งบรรทัดทั่วไปเพิ่มเติมหลาย ๆ ไฟล์อาจถูกปล้นโดยการเรียงไฟล์ก่อน diff ดังนั้นฉันจะเพิ่มสิ่งที่เขียนไว้แล้วต่อไปนี้:

 diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)

หลักสูตรนี้เหมาะสมสำหรับไฟล์ที่คำสั่งซื้อของบรรทัดไม่ส่งผลกระทบต่อเนื้อหา (โปรดระวัง)


1

นี่เป็นเหมือนกับซับในของ nima แต่จะกรองบรรทัดว่างตามที่ใครบางคนร้องขอ

diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)

(ฉันจะติดตั้ง colordiff ถ้าเป็นไปได้และใช้สิ่งนั้นแทน diff ทั่วไป)


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