วิธีการส่งออกสี diff?


18

ฉันต้องการฟอร์แมตไฟล์ Unix แบบมีเงื่อนไขตอนนี้ฉันกำลังทำงานกับdiffคำสั่งและต้องการทราบว่าเป็นไปได้หรือไม่ที่จะจัดรูปแบบข้อความของdiffเอาต์พุตคำสั่ง

ตัวอย่าง:

ค่าที่ตรงกันควรแสดงเป็นสีเขียว
ค่าที่ไม่ตรงกันควรแสดงเป็นสีแดง

สมมติว่าฉันมีสองไฟล์file1และคำสั่งของฉันคือfile2diff file1 file2

ตอนนี้ฉันต้องการที่สมมติว่าผลลัพธ์มี 5 ไม่ตรงกันจากนั้นไม่ตรงกันเหล่านั้นควรจะแสดงในสีแดง วิธีการบรรลุสิ่งนี้โดยใช้ยูนิกซ์?

ในระยะสั้น "เปลี่ยนสีเป็นสีแดงสำหรับผลลัพธ์ของคำสั่ง diff สำหรับค่าที่ไม่ตรงกัน"


2
ซ้ำเป็นไปได้ของเรื่องนี้
FloHimself

คำว่า "การจับคู่" และ "mismach" นั้นค่อนข้างสับสน อย่างไรก็ตามมีตัวเลือก --color ใน diff 3.4 และใหม่กว่า
Gerry Lufwansa

คำตอบ:


24

diff --color ตัวเลือกถูกเพิ่ม GNU diffutils 3.4 (2016-08-08)

นี่คือการdiffใช้งานเริ่มต้นสำหรับ distros ส่วนใหญ่ซึ่งจะได้รับในไม่ช้า

ใน 3.5 ดูเหมือนว่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

ด้วย:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

ฉันได้ขอระดับคำต่างจากdiff-highlightที่: [Diffutils-devel] เพิ่มธงเพื่อสร้างเอาต์พุตสีเช่น diff-h ของ git | lists.gnu.org

เพิ่มชัดเจนในการกระทำ c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (มีนาคม 2015)


1
ยอดเยี่ยม หากต้องการเปิดใช้งานสิ่งนี้ตามค่าเริ่มต้น: alias diff='diff --color=auto'
Tom Hale

1
นี่คือเอกสารประกอบ
Alexey

19

หากคุณมีสิทธิ์เข้าถึง GNU diffคุณสามารถใช้--X-group-formatตัวเลือกเพื่อรับผลกระทบนั้นโดยไม่ต้องใช้เครื่องมือเพิ่มเติม:

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

ที่ใช้รหัสหลบหนีสี ANSIเพื่อรับสีแดงและสีเขียวด้วยการอ้างอิง ANSI-Cในเปลือกเพื่อเข้าถึงการ\eหลบหนี

--old-group-formatและ--new-group-formatระบุบรรทัดที่ไม่ตรงกันและแทรกระหว่างรหัสรีเซ็ตสีแดงและสีโดยใช้%<และ%>ในขณะที่--unchanged-group-formatแทรกบรรทัดที่ตรงกันระหว่างรหัสสีเขียวและรหัสรีเซ็ต

นอกจากนี้คุณยังสามารถใช้--old-line-format ( ฯลฯ ) --old-line-format=$'\e[0;31m%L\e[0m'ค่าใช้จ่ายของหนีสีซ้ำซ้อนในทุกบรรทัด:


เมื่อฉันเรียกใช้มันให้ diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - - diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - o diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - d diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - - diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - g diff: 0653-821 ตัวเลือกที่ผิดกฎหมาย - o ชอบข้อผิดพลาด
Aman

Hormer เมื่อฉันรันคำสั่งของคุณทีละบรรทัดมันให้บรรทัดใหม่ที่ไม่มีเอาต์พุต -bash-4.2 $ - - รูปแบบกลุ่มใหม่ = $ '\ e [0; 31m%> \ e [0m' \ >
Aman

ฉันจะกำหนดค่าเริ่มต้นได้ไหม
Eugen Konkov

@EugenKonkov diffคุณสามารถตั้งค่านามแฝงหรือฟังก์ชั่นในเปลือกของคุณทำงานว่า
Michael Homer

นี่ทำให้ฉันมีปัญหาเล็กน้อยที่พยายามทำให้มันใช้งานได้ สิ่งที่ไม่เปลี่ยนแปลงปรากฏขึ้นเมื่อเพิ่ม ... ยอมแพ้และติดตั้ง colordiff
Brian Peterson

9

ลอง colordiff file1 file2

ความพร้อมใช้งานของ colordiff พร้อมการกระจาย Linux / BSD ของคุณ

ผู้ที่ใช้ Debian หรือ Ubuntu (หรือตราสารอนุพันธ์ใด ๆ ) สามารถใช้ "apt-get install colordiff" เพื่อดาวน์โหลดและติดตั้ง colordiff ยังได้รับการบรรจุสำหรับการกระจาย Linux และ UNIX และ BSD อื่น ๆ

(อ้างอิงจากhttp://www.colordiff.org/ )


1
สมบูรณ์ สำหรับฉันมันdiff --color=autoเป็นเพียงเครื่องหมายเส้นสีและบรรทัดแรกของแต่ละ+/ -ส่วน การวางท่อเพื่อless -SRให้เรียกดูได้ง่าย
Walf

4

ouput สีระดับคำ diff

นี่คือสิ่งที่คุณสามารถทำได้ด้วยสคริปต์ด้านล่างและไฮไลต์ diff :

ภาพหน้าจอ diff สี

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

( คำตอบให้เครดิตกับ@ retracileสำหรับการsedเน้น)


1

คุณควรดูhlคำสั่งที่มีอยู่ใน github: git clone http://github.com/mbornet-hl/hl และใน: http://www.flashnux.com/notes/page_000022_US.html

hlเป็นคำสั่ง Linux ที่เขียนด้วยภาษา C ออกแบบมาเป็นพิเศษเพื่อให้สีไฟล์ข้อความหรือผลลัพธ์ของคำสั่ง คุณสามารถใช้สีสูงสุด42 สีพร้อมกันและใช้ไฟล์กำหนดค่าเพื่อทำให้บรรทัดคำสั่งง่ายขึ้น คุณสามารถ colorize ผลลัพธ์ของทุกคำสั่งที่สามารถ piped ไปยังอีกอัน และถ้าคุณรู้ว่านิพจน์ทั่วไปคืออะไรมันจะง่ายมากสำหรับคุณที่จะใช้ คุณสามารถใช้manหน้าเพื่อทำความเข้าใจวิธีการใช้งาน
hlใช้งานง่ายและกำหนดค่า คุณยังสามารถใช้สคริปต์hl_genericเพื่อเอาท์พุทคำสั่ง colorize โดยไม่ต้องแก้ไขไวยากรณ์
ตัวอย่างเช่นคุณสามารถ colorize ผลลัพธ์ของdiffคำสั่งเพียงแค่พิมพ์คำสั่งปกติของคุณ:

diff file1 file2

หากคุณต้องการความช่วยเหลือเพียงแค่ส่งอีเมล
ความนับถือ.


1

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


1

หากคุณติดตั้งเป็นกลุ่มคุณสามารถทำได้ diff file1 file2 | vim -

Vim จะจดจำรูปแบบ diff และให้สีที่เหมาะสม เส้นประที่ส่วนท้ายคือให้ vim รับอินพุตจากคำสั่ง diff


'มุมมอง' (ทางลัดสำหรับอ่านอย่างเดียว) เหมาะสำหรับวัตถุประสงค์นี้
Anupam Srivastava


0

ไม่ว่าคุณจะใช้

1diff --color=auto file1 file2

2colordiff file1 file2

3. My Favorite: git diff file1 file2ดำเนินการดังต่อไปนี้:

ขณะนี้ฉันใช้และแนะนำคืออาจใช้git diff หรือไพพ์เอาท์พุทด้วยcolordiffโดยใช้:

diff() { git diff --no-index "$1" "$2" | colordiff; }


ฉันก็ชอบเหมือนgit diff --no-indexกัน แต่ฉันคิดว่าต้องหาไฟล์ด้วย (อย่างน้อยก็ใช้ไม่ได้กับการทดแทนกระบวนการทุบตีให้ฉัน)
Karl

@Karl รูปที่แยกตัวเองอาจจะมีการตั้งค่า Terminal ที่ทำ (หรือ) วิธีอื่นเพื่อให้ค้นหาได้ ฉันใช้git diffมาเป็นเวลานานและหาไฟล์ได้สำหรับฉันไม่เช่นนั้นฉันจะไม่ทำสิ่งที่ถูกต้อง
himanshuxd

2
บางทีฉันไม่ชัดเจนชัดเจน ในฐานะที่เป็น (โง่) ตัวอย่างเช่นนี้การทำงานสำหรับฉันแต่ไม่ได้มีdiff --color <(ls | head -n+3) <(ls | tail -n +5) git diffเป็นที่ยอมรับไม่ใช่กรณีทั่วไปหรือยากเกินกว่าจะหลีกเลี่ยงได้
คาร์ล

0

เพียงแค่ทราบว่า: เพื่อให้ได้ผลลัพธ์ "เคียงข้างกัน" ที่คุณต้องการ "--color = always" นอกจากนี้คุณยังสามารถแบ่งหน้าด้วยจำนวนที่น้อยลงและคงเอาท์พุทสีไว้ได้:

diff -y --color=always file1 file2 | less -R

และยังมีคำใบ้อื่น: พยายามให้สวิตช์ "--color = always" ปิดท้าย เหตุผล? ด้วย dmesg จาก util-linux 2.27.1:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

สคริปต์นี้ใช้ diff-pre-version 3.4 (ควรทำงานกับ diff ทุกเวอร์ชั่น) และปรับสีเอาท์พุทโดยไม่ต้องเปลี่ยนรูปแบบเอาต์พุตในทางใดทางหนึ่ง ใช้งานได้กับ RHEL เวอร์ชันล่าสุด (เวอร์ชั่น 7.5) ซึ่งมี GNU diff รุ่น 3.3 เพียงวางไว้ในไดเรกทอรี ~ / bin หรือที่อื่น ๆ ในเส้นทางของคุณ (ฉันขอแนะนำให้เรียกมันว่า "cdiff")

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

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