Bagaimana cara pipa keluaran diff berwarna menjadi kurang?

37

Saya telah menggunakan git diff, yang menghasilkan keluaran berwarna. Namun, sekarang saya merasa perlu menggunakan diff biasa untuk sesuatu, dan itu menghasilkan banyak output yang sulit dibaca karena kurangnya warna. Bagaimana cara membuat diff menghasilkan output berwarna yang dapat dibaca? Idealnya sambil memipisnya menjadi lebih sedikit, agar mudah meninjau file besar.

Benubird
sumber

Jawaban:

32

difftidak dapat menampilkan warna, Anda memerlukan program lain, seperti colordiffuntuk itu. Warna dalam terminal dicetak melalui kode pelarian ANSI yang kurang diartikan secara default. Untuk lessmenampilkan warna dengan benar, Anda memerlukan -r, atau bahkan lebih baik, -Rberalih:

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

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

Atau, Anda dapat menggunakan moreyang akan menampilkan warna dengan benar secara default.


Jika Anda tidak dapat menginstal program eksternal, Anda harus bisa mendapatkan hasil yang sama menggunakan pendekatan yang lebih manual:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
terdon
sumber
1
Dan jika seseorang ingin melihat persentase dari data yang ditampilkan, mereka harus menggunakan less -RM +Gg: superuser.com/questions/64972/…
baptx
13

Jawaban lain di sini mungkin sudah ketinggalan zaman. Pada coreutils 3.5 diffmemang dapat menghasilkan keluaran berwarna yang dimatikan secara default ketika stdout bukan konsol.

Dari halaman manual:

--color[=WHEN]
mewarnai output; WHENdapat berupa never,, alwaysatau auto(default)

Untuk memaksa keluaran warna ketika stdout adalah pipa diff --color=always -- "$file1" "$file2" | less -Rharus bekerja.

Kshitiz Sharma
sumber
Anda juga dapat memasukkan alias diff='diff --color=always'dalam .bashrcatau .zshrcfile.
jftuga
1
Iya nih. Saya menggunakanalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma
Saya menggunakan alias diff='/usr/bin/diff --color=always 'dan alias less='/usr/bin/less -r 'tetapi meskipun diff awalnya berwarna pada beberapa halaman pertama kurang tetapi pada diff panjang kadang-kadang membalik kembali ke mono. Ini mungkin pada lompatan yang jelas tidak akan mempengaruhi diff, karena outputnya hanya dihasilkan satu kali dan tidak harus melompat, tetapi entah bagaimana kurang kehilangan jejak warna.
NeilG
8

Untuk menyalurkan diff berwarna kurang:

diff $file1 $file2 | colordiff | less -r

Agar lebih mudah dibaca, dengan membatasi ke satu layar:

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

Dan, yang menyebabkan kurang untuk tidak ditampilkan jika hanya ada satu konten yang bernilai:

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

-F menyebabkan kurang segera menutup jika ada kurang dari satu layar worht konten, pipa ke stderr adalah karena ketika kurang menutup Anda kehilangan output - dengan menyalurkan ke stderr, itu mendapatkan output bahkan jika kurang tidak menampilkan.

Cara alternatif (dan, saya pikir, lebih baik), adalah dengan menggunakan -X untuk mencegah kurang membersihkan layar:

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

Ini berfungsi baik untuk saya, tetapi mungkin khusus untuk bash. colordiff bukan built-in, tetapi mudah dipasang.

Benubird
sumber
2
Satu-satunya perintah yang ia butuhkan adalahless -r
sendmoreinfo