Renkli diff çıkışını daha az boruya nasıl alabilirim?


37

Renkli çıktılar üreten git diff kullanıyorum. Ancak, şimdi bir şey için sıradan bir fark kullanmaya ihtiyacım olduğunu ve renklerin yetersizliğinden dolayı okunması zor olan bir sürü çıktı ürettiğini anlıyorum. Dif'in okunabilir, renkli çıktılar üretmesini nasıl sağlayabilirim? Büyük dosyaların kolayca gözden geçirilebilmesi için daha az boruya döşenirken idealdir.

Yanıtlar:


32

diffrenkleri çıkaramazsanız, bunun gibi başka bir programa ihtiyacınız colordiffvardır. Terminaldeki renkler, varsayılan olarak daha az yorumlamayan ANSI çıkış kodları ile yazdırılır . Almak için lessdoğru renkleri göstermek için, size gereken -rveya daha da iyisi, -Ranahtar:

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

Kimden 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.

Alternatif olarak, morerenkleri varsayılan olarak doğru gösterecek olanı kullanabilirsiniz .


Harici programları kuramazsanız, aynı çıktıyı daha manuel bir yaklaşım kullanarak elde edebilmeniz gerekir:

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

1
Ve biri görüntülenen verilerin yüzdesini görüntülemek istiyorsa, kullanmaları gerekir less -RM +Gg: superuser.com/questions/64972/…
baptx

13

Buradaki diğer cevaplar güncel olmayabilir. Coreutils 3.5'ten dolayı diff, aslında stdout bir konsol olmadığı zaman varsayılan olarak kapalı olan renkli çıktılar üretebilir.

Man sayfasından:

--color[=WHEN]
çıktıyı renklendirmek; WHENolabilir never, alwaysya da auto(varsayılan)

Stdout bir boru olduğunda renk çıkışını zorlamak için bir boru diff --color=always -- "$file1" "$file2" | less -Rçalışması gerekir.


Ayrıca alias diff='diff --color=always'bir .bashrcveya .zshrcdosyaya dahil edebilirsiniz .
jftuga

1
Evet. Ben kullanıyorumalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma

Kullandığım alias diff='/usr/bin/diff --color=always 've alias less='/usr/bin/less -r 'ancak fark başlangıçta az ilk birkaç sayfalarında ancak uzun fark dosyaları üzerinde renkli olmasına rağmen bazen mono geri çevirir. Bu, farklılığı açıkça etkilemeyecek sıçramalar üzerinde olabilir, çünkü çıktı yalnızca bir kez üretilir ve atlamak zorunda kalmaz, ancak bir şekilde daha az renk izini kaybeder.
NeilG

8

Renkli farkı daha az borulamak için:

diff $file1 $file2 | colordiff | less -r

Tek bir ekrana sınırlayarak daha okunabilir hale getirmek için:

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

Ayrıca, içeriğe değer yalnızca bir ekran varsa, görüntülenmemesine neden olmak için:

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

İçerikten daha az ekran varsa, -F hemen kapanmasına neden olur, çünkü daha az kapanırsa stderr için olan boru - daha az görüntülemese bile stderr'e borulama yaparak çıkış alır.

Alternatif (ve sanırım daha iyi) bir yol, ekranı daha az silmeyi önlemek için -X kullanmaktır:

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

Bu benim için iyi çalışıyor, ancak bash için spesifik olabilir. colordiff yerleşik bir cihaz değildir, ancak kolayca monte edilebilir.


2
less -r
İhtiyacı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.