ฉันจะส่งออก diff diff สีให้น้อยลงได้อย่างไร


37

ฉันใช้ git diff ซึ่งสร้างเอาต์พุตสี อย่างไรก็ตามตอนนี้ฉันพบว่าฉันจำเป็นต้องใช้ diff ทั่วไปสำหรับบางสิ่งบางอย่างและมันให้ผลผลิตจำนวนมากที่อ่านยากเพราะขาดสี ฉันจะทำให้ diff สร้างเอาต์พุตที่อ่านได้และมีสีได้อย่างไร เป็นการดีที่จะลดขนาดให้เล็กลงเพื่อให้ง่ายต่อการตรวจสอบไฟล์ขนาดใหญ่

คำตอบ:


32

diffไม่สามารถสีออกคุณต้องใช้โปรแกรมอื่นเช่นcolordiffการที่ สีในเทอร์มินัลจะถูกพิมพ์ผ่านANSI รหัสหลีกเลี่ยงซึ่งน้อยกว่าไม่ตีความโดยค่าเริ่มต้น ในlessการแสดงสีอย่างถูกต้องคุณต้องใช้สวิตช์ที่-rดีกว่าหรือดีกว่า-R:

colordiff -- "$file1" "$file2" | less -R

จากman less:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

หรือคุณสามารถใช้moreซึ่งจะแสดงสีได้อย่างถูกต้องตามค่าเริ่มต้น


หากคุณไม่สามารถติดตั้งโปรแกรมภายนอกคุณควรจะได้ผลลัพธ์เดียวกันโดยใช้วิธีการแบบแมนนวลเพิ่มเติม:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'

1
และถ้ามีคนต้องการดูเปอร์เซ็นต์ของข้อมูลที่แสดงพวกเขาต้องใช้less -RM +Gg: superuser.com/questions/64972/ …
baptx

13

คำตอบอื่น ๆ ที่นี่อาจล้าสมัย ในฐานะของ coreutils 3.5 diffสามารถผลิตสีที่แน่นอนซึ่งถูกปิดโดยค่าเริ่มต้นเมื่อ stdout ไม่ใช่คอนโซล

จากหน้าคน:

--color[=WHEN]
ทำสีเอาท์พุท; WHENสามารถnever, alwaysหรือauto(ค่าดีฟอลต์)

เพื่อบังคับให้แสดงผลสีเมื่อ stdout เป็นไปป์diff --color=always -- "$file1" "$file2" | less -Rควรทำงาน


คุณสามารถรวมalias diff='diff --color=always'ไว้ในไฟล์.bashrcหรือ .zshrc
jftuga

1
ใช่. ฉันกำลังใช้alias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma

ฉันใช้alias diff='/usr/bin/diff --color=always 'และalias less='/usr/bin/less -r 'ถึงแม้ว่า diff จะมีสีเริ่มต้นในไม่กี่หน้าแรกของน้อยกว่า แต่ในความยาว diffs บางครั้งก็พลิกกลับไปขาวดำ นี่อาจเป็นการกระโดดที่เห็นได้ชัดว่าจะไม่ส่งผลกระทบต่อความแตกต่างเนื่องจากเอาต์พุตจะถูกสร้างขึ้นเพียงครั้งเดียวและไม่จำเป็นต้องกระโดด
NeilG

8

หากต้องการสีของท่อแตกต่างกันให้น้อยลง:

diff $file1 $file2 | colordiff | less -r

หากต้องการทำให้อ่านง่ายขึ้นโดย จำกัด ไว้ที่หน้าจอเดียว:

diff -uw $file1 $file2 | colordiff | less -r

และเพื่อให้น้อยลงที่จะไม่แสดงหากมีเพียงหน้าจอเดียวที่มีมูลค่าเนื้อหา:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

-F ทำให้น้อยลงที่จะปิดทันทีหากมีหน้าจอน้อยกว่าหนึ่งหน้าจอกังวลกับเนื้อหาไปป์ที่ stderr เป็นเพราะเมื่อปิดน้อยกว่าคุณจะสูญเสียเอาต์พุต - โดยการไพพ์ไปที่ stderr จะได้รับเอาต์พุตแม้ว่าจะไม่แสดงน้อยก็ตาม

ทางเลือกที่หนึ่ง (และฉันคิดว่าดีกว่า) คือใช้ -X เพื่อป้องกันการล้างหน้าจอน้อยลง:

diff -uw $file1 $file2 | colordiff | less -r -X -F

สิ่งนี้ใช้ได้ดีสำหรับฉัน แต่อาจเฉพาะเจาะจงกับการทุบตี colordiff ไม่ใช่แบบในตัว แต่ติดตั้งได้ง่าย


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