Bagaimana cara mewarnai keluaran diff?


18

Saya ingin memformat file Unix secara kondisional, saya saat ini sedang mengerjakan diffperintah dan ingin tahu apakah mungkin untuk memformat teks dari diffoutput perintah.

Contoh:

Nilai yang cocok harus ditampilkan dalam warna hijau.
Nilai yang tidak cocok harus ditampilkan dalam warna merah.

Misalkan saya punya dua file file1dan file2dan perintah saya adalah diff file1 file2.

Sekarang saya ingin bahwa misalkan output mengandung 5 ketidakcocokan maka ketidakcocokan tersebut harus ditampilkan dalam warna Merah. Bagaimana cara mencapai ini menggunakan unix?

Singkatnya "Ubah warna menjadi merah untuk output dari perintah diff untuk nilai yang tidak cocok"


2
Kemungkinan duplikat dari ini
FloHimself

Istilah "cocok" dan "mismach" agak membingungkan. Bagaimanapun, ada opsi --color sekarang di diff 3.4 dan yang lebih baru.
Gerry Lufwansa

Jawaban:


23

diff --color opsi telah ditambahkan GNU diffutils 3.4 (2016-08-08)

Ini adalah diffimplementasi default pada sebagian besar distro, yang akan segera mendapatkannya.

Pada 3.5 terlihat seperti ini:

masukkan deskripsi gambar di sini

dengan:

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

Saya juga telah meminta perbedaan level kata mulai dari diff-highlightpada: [Diffutils-devel] Tambahkan flag untuk menghasilkan keluaran berwarna seperti git's diff-h | lists.gnu.org

Rupanya ditambahkan di commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015).


1
Luar biasa! Untuk mengaktifkan ini secara default: alias diff='diff --color=auto'
Tom Hale

1
Ini dokumentasinya.
Alexey

19

Jika Anda memiliki akses ke GNU, diffAnda dapat menggunakan --X-group-formatopsinya untuk mendapatkan efek itu tanpa alat tambahan:

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

Itu menggunakan kode pelarian warna ANSI untuk mendapatkan merah dan hijau, dengan ANSI-C mengutip di shell untuk mengakses \elolos.

--old-group-formatdan --new-group-formatmengidentifikasi garis yang tidak cocok dan menyisipkannya di antara kode reset merah dan warna menggunakan %<dan %>, sambil --unchanged-group-formatmemasukkan garis yang cocok antara kode hijau dan reset.

Anda juga dapat menggunakan--old-line-format (dll), dengan mengorbankan lolos warna berlebihan pada setiap baris: --old-line-format=$'\e[0;31m%L\e[0m'.


ketika saya menjalankannya memberikan diff: 0653-821 opsi ilegal - - diff: 0653-821 opsi ilegal - o diff: 0653-821 opsi ilegal - d diff: 0653-821 opsi ilegal - - diff: 0653-821 opsi ilegal - g diff: 0653-821 opsi ilegal - o suka kesalahan.
Aman

Hormer ketika saya menjalankan perintah Anda dengan satu baris pada satu waktu itu memberikan baris baru tanpa output -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman

Bolehkah saya mengkonfigurasi itu secara default?
Eugen Konkov

@EugenKonkov Anda dapat mengatur alias atau fungsi di shell Anda untuk menjalankannya diff.
Michael Homer

Ini memberi saya sedikit kesulitan untuk membuatnya bekerja. Barang yang tidak berubah muncul saat ditambahkan ... menyerah dan memasang colordiff
Brian Peterson

9

Mencoba colordiff file1 file2

Ketersediaan colordiff dengan distribusi Linux / BSD Anda

Mereka yang menjalankan Debian atau Ubuntu (atau turunannya) mungkin hanya dapat menggunakan "apt-get install colordiff" untuk mengunduh dan menginstal; colordiff juga dikemas untuk sejumlah distribusi Linux, sistem operasi UNIX dan BSD lainnya.

(Kutipan dari http://www.colordiff.org/ )


1
Sempurna. Bagi saya, diff --color=autohanya mewarnai marka garis dan baris pertama setiap +/ -bagian. Perpipaan less -SRuntuk memudahkan penelusuran.
Walf

4

Berwarna, ouput tingkat kata diff

Inilah yang dapat Anda lakukan dengan skrip di bawah ini dan sorot berbeda :

Tangkapan layar berwarna yang berbeda

#!/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

( Terima kasih atas jawaban @ retracile untuk sedsorotan)


1

Anda harus melihat hlperintah yang tersedia di github: git clone http://github.com/mbornet-hl/hl dan di: http://www.flashnux.com/notes/page_000022_US.html

hladalah perintah Linux yang ditulis dalam C, khusus dirancang untuk mewarnai file teks atau output dari suatu perintah. Anda dapat menggunakan hingga 42 warna secara bersamaan, dan menggunakan file konfigurasi untuk menyederhanakan baris perintah. Anda dapat mewarnai keluaran dari setiap perintah yang dapat disalurkan ke perintah lainnya. Dan jika Anda tahu apa ekspresi reguler, akan sangat mudah bagi Anda untuk menggunakannya. Anda dapat menggunakan manhalaman ini untuk memahami cara menggunakannya.
hlsangat mudah digunakan dan dikonfigurasi. Anda bahkan dapat menggunakan skrip hl_generic untuk mewarnai keluaran perintah tanpa mengubah sintaksisnya.
Anda dapat, misalnya, mewarnai keluaran diffperintah hanya dengan mengetikkan perintah biasa Anda:

diff file1 file2

Jika Anda butuh bantuan, kirimkan saya email.
Salam.


1

Ada alat yang benar-benar rapi yang dibangun dengan python di Github saat ini icdiff. Menghasilkan keluaran berwarna bagus yang juga “keparahan” sadar. Saya menggunakannya sepanjang waktu, layak untuk dicoba.


0

Anda bisa menggunakannya

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. Favorit Saya: git diff file1 file2diimplementasikan sebagai berikut:

Saat ini saya menggunakan dan merekomendasikan adalah , baik menggunakan git diff atau menyalurkan outputnya dengan colordiffmenggunakan:

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


Saya git diff --no-indexjuga suka tapi saya pikir file harus dapat dicari. (Setidaknya, tidak bekerja dengan substitusi proses bash untuk saya)
Karl

@Karl Gambar yang keluar sendiri, mungkin ada pengaturan Terminal yang melakukannya (atau) beberapa cara lain untuk membuatnya dapat dicari. Saya telah menggunakan git diffdari waktu yang lama dan file tersebut dapat dicari untuk saya, jika tidak, tidak akan ada gunanya saya melakukannya dengan benar.
himanshuxd

2
Mungkin saya tidak jelas sangat jelas. Sebagai contoh (konyol), ini bekerja untuk saya diff --color <(ls | head -n+3) <(ls | tail -n +5)tetapi tidak dengan git diff. Memang, bukan kasus umum atau terlalu sulit untuk diselesaikan.
Karl

0

Hanya sebuah catatan: untuk mendapatkan output "berdampingan" yang Anda butuhkan "--color = always". Anda juga dapat membuat pagination dengan lebih sedikit dan mempertahankan output berwarna:

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

Dan petunjuk lain: cobalah untuk tetap beralih "--color = always" di akhir. Alasan? Dengan dmesg dari util-linux 2.27.1:

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

0

Script ini menggunakan diff standar pra-versi 3.4 (harus bekerja dengan semua versi diff) dan mewarnai output tanpa mengubah format output dengan cara apa pun. Ini bekerja dengan versi terbaru RHEL (versi 7.5) yang memiliki GNU diff versi 3.3. Cukup letakkan di direktori ~ / bin Anda atau di mana saja di jalur Anda (saya sarankan menyebutnya "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/"

0

jika Anda telah menginstal vim, Anda dapat melakukannya diff file1 file2 | vim -

Vim akan mengenali format diff dan memberikan pewarnaan yang tepat. Tanda hubung di akhir adalah membiarkan vim menerima input dari perintah diff.


'view' (pintasan baca-saja ke vim) lebih cocok untuk tujuan ini.
Anupam Srivastava

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.