Fark çıktı nasıl renklendirilir?


18

Unix dosyalarını koşullu olarak biçimlendirmek istedim, şu anda diffkomut üzerinde çalışıyorum ve diffkomut çıktısının metnini biçimlendirmenin mümkün olup olmadığını bilmek istedim .

Misal:

Eşleşen değerler yeşil renkte gösterilmelidir.
Eşleşmeyen değerler kırmızı renkte gösterilmelidir.

İki dosya var varsayalım file1ve file2ve benim için emirdir diff file1 file2.

Şimdi çıktının 5 uyumsuzluk içerdiğini varsayarak bu uyumsuzluğun Kırmızı renkte görüntülenmesini istedim. Unix kullanarak bunu nasıl başarabilirim?

Kısaca "Uyuşmayan değerler için diff komutu çıktısı için rengi kırmızıya değiştir"


2
Olası yinelenen bu
FloHimself

"Maç" ve "uyumsuzluk" terimleri biraz kafa karıştırıcıdır. Her neyse, şimdi fark 3.4 ve sonrasında --color seçeneği var.
Gerry Lufwansa

Yanıtlar:


24

diff --color seçenek GNU diffutils 3.4 eklendi (2016-08-08)

Bu, diffçoğu dağıtımda varsayılan uygulamadır ve yakında kullanıma sunulacaktır.

3.5'de şöyle görünür:

resim açıklamasını buraya girin

ile:

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

Ayrıca diff-highlightşu adresten farklı kelime seviyesi farkı talep ettim : [Diffutils-devel] Git'in diff-h gibi renkli çıktılar üretmek için bir bayrak ekleyin | lists.gnu.org

Görünüşe göre c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015) 'de eklendi.


1
Mükemmel! Bunu varsayılan olarak etkinleştirmek için: alias diff='diff --color=auto'
Tom Hale

1
İşte belgeler.
Alexey

19

GNU'ya erişiminiz diffvarsa, herhangi bir ek araç kullanmadan bu etkiyi elde etmek için --X-group-formatseçeneklerini kullanabilirsiniz :

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

Yani kullanımları ANSI renk kaçış kodları ile, kırmızı ve yeşil almak için ANSI-C alıntı erişime kabuğunda \ekaçar.

--old-group-formatve --new-group-formateşleşmeyen satırları belirleyebilir ve bunları kullanarak kırmızı ve renk sıfırlama kodları arasına ekleyebilirsiniz%< yeşil ile sıfırlama kodları arasına eşleşen satırları %>eklerken ve ile--unchanged-group-format .

Ayrıca edebilirsiniz kullanmak--old-line-format her satırda gereksiz renk kaçar pahasına, (vs): --old-line-format=$'\e[0;31m%L\e[0m'.


çalıştırdığımda fark verir: 0653-821 geçersiz seçenek - - fark: 0653-821 geçersiz seçenek - o fark: 0653-821 geçersiz seçenek - d fark: 0653-821 geçersiz seçenek - - fark: 0653-821 geçersiz seçenek - g fark: 0653-821 geçersiz seçenek - o benzer hatalar.
Aman

Bir seferde bir satır gibi komutlarınızı çalıştırırken Hormer yeni bir satır vermiyor çıkış -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman

Bunu varsayılan olarak yapılandırabilir miyim?
Eugen Konkov

@EugenKonkov Bunu çalıştırmak için kabuğunuzda bir takma ad veya işlev ayarlayabilirsiniz diff.
Michael Homer

Bu beni işe almak için biraz sorun verdi. Değişmeyen şeyler eklendiği gibi görünüyordu ... vazgeçti ve kolordiff kurdu
Brian Peterson

9

Deneyin colordiff file1 file2

Linux / BSD dağıtımınızla renklendirici kullanılabilirliği

Debian veya Ubuntu (veya türevlerinden herhangi birini) çalıştıranlar, indirmek ve yüklemek için muhtemelen "apt-get install colordiff" kullanabilir; colordiff ayrıca bir dizi diğer Linux, UNIX ve BSD dağıtımı ve işletim sistemi için paketlenmiştir.

(Alıntı http://www.colordiff.org/ )


1
Mükemmel. Benim için, diff --color=autosadece renk belirteçleri çizgi ve her +/ -bölümün ilk satırı oldu . less -SRKolay tarama için borulama yapar.
Walf

4

Renkli, kelime seviyesi diff çıkış

Aşağıdaki komut dosyası ve diff-vurgulama ile yapabilecekleriniz :

Colored diff ekran görüntüsü

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

(Kredi @ retracile cevabı için sedvurgulama)


1

hlGithub: git clone http://github.com/mbornet-hl/hl ve şu adreslerde bulunan komuta bir göz atmalısınız : http://www.flashnux.com/notes/page_000022_US.html

hlözellikle bir metin dosyasını veya bir komutun çıktısını renklendirmek için tasarlanmış C dilinde yazılmış bir Linux komutudur. Aynı anda 42 renge kadar kullanabilir ve komut satırlarını basitleştirmek için bir yapılandırma dosyası kullanabilirsiniz. Pipete alınabilen her komutun çıktısını renklendirebilirsiniz. Ve düzenli ifadelerin ne olduğunu biliyorsanız, kullanmanız çok kolay olacaktır. Nasıl kullanılacağını mananlamak için sayfayı kullanabilirsiniz.
hlkullanımı ve yapılandırması çok kolaydır. Hatta hl_generic komut dosyasını söz dizimini değiştirmeden komut çıktısını renklendirmek için de kullanabilirsiniz .
Örneğin, diffsadece normal komutunuzu yazarak komutun çıktısını renklendirebilirsiniz :

diff file1 file2

Yardıma ihtiyacınız olursa bana bir e-posta gönderin.
Saygılarımızla.


1

Şu anda Github'da python ile inşa edilmiş gerçekten temiz bir araç var icdiff. Aynı zamanda “ciddiyet” farkında olan güzel renkli çıktılar üretir. Her zaman kullanıyorum, iyi kontrol etmeye değer.


1

vim yüklüyse yapabilirsin diff file1 file2 | vim -

Vim fark biçimini tanıyacak ve uygun renklendirmeyi verecektir. Sondaki tire, vim'in diff komutundan girişi kabul etmesine izin vermektir.


'view' (vim'in salt okunur kısayolu) bu amaç için daha uygundur.
Anupam Srivastava

1

Jenerik Renklendirici ( grc ) yükleyin ve:

grc diff file1 file2

Hem Linux hem de MacOS'ta kullanılabilir.


0

Ya kullanabilirsiniz

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. benim favorim: git diff file1 file2 aşağıdaki gibi uygulanan:

Şu anda kullanmak ve tavsiye, kullanarak git diff veya kullanarak çıkışını colordiffkullanarak:

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


Ben de git diff --no-indexseviyorum ama bence dosyalar aranabilir olmalı. (En azından benim için bash süreci ikamesi ile çalışmıyor)
Karl

@Karl Kendinizi ayıran figür, belki de aranabilir hale getirmek için başka bir yol (veya) yapan bir Terminal ayarı vardır. Ben kullanıyorum git diffaksi Doğru yapıyor beni hiçbir faydası olurdu, uzun zaman ve dosya benim için aranabilir olduğunu.
himanshuxd

2
Belki de çok net değildim. (Aptalca) bir örnek olarak, bu benim için işe yarar diff --color <(ls | head -n+3) <(ls | tail -n +5)ama birlikte değil git diff. Kuşkusuz, yaygın bir durum değil veya etrafta çalışmak çok zor.
Karl

0

Sadece bir not: "yan yana" çıktı almak için "--color = always" gerekir. Ayrıca daha azla sayfalandırabilir ve renkli çıktıyı koruyabilirsiniz:

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

Ve yine başka bir ipucu: "--color = always" anahtarını sonunda tutmaya çalışın. Nedeni? Util-linux 2.27.1'den dmesg ile:

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

0

Bu komut dosyası, standart ön sürüm 3.4 diff'i kullanır (diff'in herhangi bir sürümüyle çalışmalıdır) ve çıktı biçimini hiçbir şekilde değiştirmeden çıktıyı renklendirir. GNU diff sürüm 3.3'e sahip en son RHEL sürümü (sürüm 7.5) ile çalışır. Sadece ~ / bin dizininize veya yolunuzdaki herhangi bir yere koyun ("cdiff" olarak adlandırmanızı öneririm).

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

Karakter seviyesi renk farkı: ccdiff yükleyin

ccdiff -r /usr/share/dict/words /tmp/new-dict

Ccdiff çıkışı

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.