¿Cómo colorear la salida de diferencia?

18

Quería formatear los archivos de Unix condicionalmente, actualmente estoy trabajando en el diffcomando y quería saber si es posible formatear el texto de la diffsalida del comando.

Ejemplo:

Los valores coincidentes deben mostrarse en verde.
Los valores no coincidentes deben mostrarse en rojo.

Supongamos que tengo dos archivos file1y file2e es mi mandamiento diff file1 file2.

Ahora quería que la salida contenga 5 desajustes, entonces esos desajustes deberían mostrarse en color rojo. ¿Cómo lograr esto usando Unix?

En resumen "Cambie el color a rojo para la salida del comando diff para valores que no coinciden"

Un hombre
fuente
2
Posible duplicado de esto
FloHimself
Los términos "coincidencia" y "falta de coincidencia" son un poco confusos. De todos modos, existe la opción --color ahora en diff 3.4 y posterior.
Gerry Lufwansa

Respuestas:

24

diff --color Se agregó la opción GNU diffutils 3.4 (2016-08-08)

Este es el valor predeterminado diff implementación en la mayoría de las distribuciones, que pronto la obtendrá.

En 3.5 se ve así:

ingrese la descripción de la imagen aquí

con:

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

También he solicitado el nivel de palabra diff a partir de diff-highlighten: [Diffutils-devel] Agregue una bandera para producir resultados en color como git's diff-h | lists.gnu.org

Aparentemente agregado en commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015).

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
1
¡Excelente! Para habilitar esto de manera predeterminada: alias diff='diff --color=auto'
Tom Hale
1
Aquí está la documentación.
Alexey
19

Si tiene acceso a GNU diff, puede usar sus --X-group-formatopciones para obtener ese efecto sin ninguna herramienta adicional:

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

Eso usa códigos de escape de color ANSI para obtener rojo y verde, con citas ANSI-C en el shell para acceder a los \eescapes.

--old-group-formate --new-group-formatidentifique líneas que no coincidan e insértelas entre los códigos de reinicio rojo y de color usando %<y %>, mientras --unchanged-group-formatinserta líneas coincidentes entre los códigos verde y de reinicio.

También puede utilizar--old-line-format (etc), a expensas de los escapes de color redundantes en cada línea: --old-line-format=$'\e[0;31m%L\e[0m'.

Michael Homer
fuente
cuando lo ejecuto da diff: 0653-821 opción ilegal - - diff: 0653-821 opción ilegal - o diff: 0653-821 opción ilegal - d diff: 0653-821 opción ilegal - - diff: 0653-821 opción ilegal - g diff: 0653-821 opción ilegal - o errores similares.
Aman
Hormer cuando estoy ejecutando sus comandos ya que una línea a la vez no da salida a la nueva línea -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman
¿Puedo configurar eso por defecto?
Eugen Konkov el
@EugenKonkov Puede configurar un alias o función en su shell para ejecutarlo diff.
Michael Homer
Esto me dio un poco de problemas para intentar que funcione. Cosas sin cambios aparecían a medida que se agregaban ... se rindieron e instalaron el colordiff
Brian Peterson el
9

Tratar colordiff file1 file2

Disponibilidad de colordiff con su distribución Linux / BSD

Aquellos que ejecutan Debian o Ubuntu (o cualquiera de sus derivados) probablemente puedan usar "apt-get install colordiff" para descargar e instalar; colordiff también está empaquetado para varias otras distribuciones y sistemas operativos Linux, UNIX y BSD.

(Cita de http://www.colordiff.org/ )

Modesto
fuente
1
Perfecto. Para mí, diff --color=autosolo se coloreaban los marcadores de línea y la primera línea de cada +/ -sección. Tubería less -SRpara facilitar la navegación.
Walf
4

Color, salida de nivel de palabra diff

Esto es lo que puede hacer con el siguiente script y diff-resaltar :

Captura de pantalla de color diff

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

(Crédito a la respuesta de @ retracile para el sedresaltado)

Tom Hale
fuente
El enlace está muerto ...
einpoklum
1

Debe echar un vistazo al hlcomando disponible en github: git clone http://github.com/mbornet-hl/hl y en: http://www.flashnux.com/notes/page_000022_US.html

hles un comando de Linux escrito en C, especialmente diseñado para colorear un archivo de texto o la salida de un comando. Puede usar hasta 42 colores simultáneamente y usar un archivo de configuración para simplificar las líneas de comando. Puede colorear la salida de cada comando que se puede canalizar a otro. Y si sabe qué son las expresiones regulares, será muy fácil de usar. Puede usar la manpágina para comprender cómo usarla.
hlEs muy fácil de usar y configurar. Incluso puede usar el script hl_generic para colorear la salida de los comandos sin modificar su sintaxis.
Puede, por ejemplo, colorear el resultado del diffcomando simplemente escribiendo su comando habitual:

diff file1 file2

Si necesita ayuda, solo envíeme un correo electrónico.
Saludos.

mbornet
fuente
1

Hay una herramienta realmente ordenada construida con python en Github en este momento llamada icdiff. Produce salidas de colores agradables que también son conscientes de la "gravedad". Lo uso todo el tiempo, vale la pena echarle un vistazo.

Joe Healey
fuente
1

si tienes vim instalado, puedes hacer diff file1 file2 | vim -

Vim reconocerá el formato diff y le dará el color adecuado. El guión al final es dejar que vim acepte la entrada del comando diff.

TrongBang
fuente
'view' (el acceso directo de solo lectura a vim) es más adecuado para este propósito.
Anupam Srivastava
1

Instale Colouriser genérico ( grc ) y:

grc diff file1 file2

Disponible en Linux y MacOS.

Sohail Si
fuente
0

O puedes usar

1)diff --color=auto file1 file2

2)colordiff file1 file2

3.Mi favorito: git diff file1 file2implementado de la siguiente manera:

Actualmente uso y recomiendo es , ya sea usando git diff o canalizando su salida colordiffusando:

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

himanshuxd
fuente
También me gusta, git diff --no-indexpero creo que los archivos deben ser buscables. (Al menos, no funciona con la sustitución del proceso bash para mí)
Karl
@Karl Imagine que se separe usted mismo, tal vez haya una configuración de Terminal que lo haga (o) de alguna otra manera para que sea buscable. Lo he estado usando git diffdesde hace mucho tiempo y el archivo es buscable para mí, de lo contrario no tendría sentido que lo hiciera bien.
himanshuxd
2
Quizás no estaba claro muy claro. Como un ejemplo (tonto), esto funciona para mí diff --color <(ls | head -n+3) <(ls | tail -n +5)pero no con git diff. Es cierto que no es un caso común o es demasiado difícil de solucionar.
Karl
0

Solo una nota: para obtener el resultado "en paralelo" necesita "--color = always". También puede paginarlo con menos y conservar la salida de color:

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

Y otra pista más: intente mantener el interruptor "--color = always" al final. ¿Razón? Con dmesg de util-linux 2.27.1:

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

Este script usa la versión previa estándar 3.4 diff (debería funcionar con cualquier versión de diff) y colorea la salida sin cambiar el formato de salida de ninguna manera. Funciona con la última versión de RHEL (versión 7.5) que tiene GNU diff versión 3.3. Simplemente colóquelo en su directorio ~ / bin o en cualquier otro lugar de su ruta (sugiero llamarlo "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/"
Beam Davis
fuente
0

Diferencia de color a nivel de caracteres: instalar ccdiff

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

Salida de ccdiff

albaricoque
fuente