¿Cómo canalizo la salida de diferencia de color a menos?


37

He estado usando git diff, que produce resultados en color. Sin embargo, ahora encuentro que necesito usar diff ordinario para algo, y está produciendo una gran cantidad de resultados que es difícil de leer debido a la falta de colores. ¿Cómo hago que diff produzca una salida de color legible? Idealmente mientras se canaliza a menos, para una fácil revisión de archivos grandes.

Respuestas:


32

diffno puede generar colores, necesita otro programa, como colordiffpara eso. Los colores en el terminal se imprimen a través de códigos de escape ANSI que menos no se interpretan por defecto. Para lessmostrar correctamente los colores, necesita el interruptor -r, o incluso mejor, -Rcambiar:

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

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

Alternativamente, puede usar el moreque mostrará los colores correctamente de forma predeterminada.


Si no puede instalar programas externos, debería poder obtener el mismo resultado utilizando un enfoque más manual:

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

1
Y si alguien quiere ver el porcentaje de los datos en pantalla, que tienen que usar less -RM +Gg: superuser.com/questions/64972/...
baptx

13

Las otras respuestas aquí pueden estar desactualizadas. A partir de coreutils 3.5 diff, de hecho, puede producir una salida en color que está desactivada por defecto cuando el stdout no es una consola.

Desde la página del manual:

--color[=WHEN]
colorear la salida; WHENpuede ser never, alwayso auto(el valor predeterminado)

Para forzar la salida de color cuando stdout es una tubería, diff --color=always -- "$file1" "$file2" | less -Rdebería funcionar.


También puede incluir alias diff='diff --color=always'en un archivo .bashrco .zshrc.
jftuga

1
Sí. Estoy usandoalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma

Yo uso alias diff='/usr/bin/diff --color=always 'y, alias less='/usr/bin/less -r 'aunque el diff se colorea inicialmente en las primeras páginas de menos pero en los diff largos, a veces vuelve a mono. Esto podría ser en saltos que claramente no afectarían a diff, ya que su salida solo se genera una vez y no tiene que saltar, pero de alguna manera pierde menos rastro de los colores.
NeilG

8

Para canalizar diff de color a menos:

diff $file1 $file2 | colordiff | less -r

Para hacerlo más legible, limitándolo a una sola pantalla:

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

Y, para que no se muestre menos si solo hay una pantalla de contenido:

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

La -F hace que se cierre menos inmediatamente si hay menos de una pantalla con contenido, la tubería a stderr se debe a que cuando cierra menos, pierde la salida: al canalizar a stderr, obtiene salida incluso si no se muestra menos.

Una forma alternativa (y creo que mejor) es usar -X para evitar que se borre menos la pantalla:

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

Esto funciona bien para mí, pero podría ser específico de bash. El colordiff no está incorporado, pero se instala fácilmente.


2
El único comando que necesita esless -r
sendmoreinfo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.