Come convoglio l'output diff colorato a meno?


37

Sto usando git diff, che produce output a colori. Tuttavia, ora trovo che ho bisogno di usare il diff ordinario per qualcosa, e sta producendo un sacco di output che è difficile da leggere a causa della mancanza di colori. Come posso fare in modo che diff produca un output leggibile e colorato? Idealmente, eseguendo il piping su un valore inferiore, per una facile revisione di file di grandi dimensioni.

Risposte:


32

diffnon è possibile produrre i colori, è necessario un altro programma, come colordiffquello. I colori nel terminale sono stampati tramite codici di escape ANSI che meno non interpretano per impostazione predefinita. Per lessvisualizzare correttamente i colori, è necessario -r, o meglio, -Rcambiare:

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

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

In alternativa, è possibile utilizzare morequali verranno visualizzati correttamente i colori per impostazione predefinita.


Se non puoi installare programmi esterni, dovresti essere in grado di ottenere lo stesso output usando un approccio più manuale:

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

1
E se qualcuno vuole visualizzare la percentuale dei dati visualizzati, deve usare less -RM +Gg: superuser.com/questions/64972/…
baptx

13

Le altre risposte qui potrebbero non essere aggiornate. A partire da coreutils 3.5 diffpuò effettivamente produrre output a colori che è disattivato di default quando lo stdout non è una console.

Dalla pagina man:

--color[=WHEN]
colorare l'output; WHENpuò essere never, alwayso auto(impostazione predefinita)

Per forzare l'output del colore quando stdout è una pipe diff --color=always -- "$file1" "$file2" | less -Rdovrebbe funzionare.


È inoltre possibile includere alias diff='diff --color=always'in un file .bashrco .zshrc.
jftuga,

1
Sì. Sto usandoalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma il

Io uso alias diff='/usr/bin/diff --color=always 'e, alias less='/usr/bin/less -r 'sebbene inizialmente il diff sia colorato nelle prime pagine di meno, ma su diff lunghi a volte ritorna in mono. Questo potrebbe essere sui salti che chiaramente non influirebbero sul diff, poiché il suo output viene generato una sola volta e non deve saltare, ma in qualche modo meno perde traccia dei colori.
NeilG

8

Per diffondere il colore in modo diverso:

diff $file1 $file2 | colordiff | less -r

Per renderlo più leggibile, limitandolo a una singola schermata:

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

E, per fare in modo che non vengano visualizzati se esiste solo una schermata di contenuti:

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

-F fa sì che meno si chiuda immediatamente se c'è meno di una schermata in base al contenuto, la pipe a stderr è perché quando meno si chiude si perde l'output - eseguendo il piping a stderr, si ottiene output anche se meno non viene visualizzato.

Un modo alternativo (e, penso, meglio), è semplicemente usare -X per evitare di schiarire lo schermo:

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

Questo funziona bene per me, ma potrebbe essere specifico per bash. colordiff non è un built-in, ma è facilmente installabile.


2
L'unico comando di cui ha bisogno èless -r
sendmoreinfo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.