Comment puis-je canaliser la sortie de diff de couleur vers moins?

37

J'ai utilisé git diff, qui produit une sortie colorée. Cependant, je constate maintenant que j'ai besoin d'utiliser un diff ordinaire pour quelque chose, et cela produit beaucoup de résultats difficiles à lire en raison du manque de couleurs. Comment faire en sorte que diff produise une sortie lisible et colorée? Idéalement tout en conservant une valeur inférieure, pour une révision facile des fichiers volumineux.

Benubird
la source

Réponses:

32

diffvous ne pouvez pas imprimer de couleurs, vous avez besoin d’un autre programme, par exemple colordiff. Les couleurs dans le terminal sont imprimées via des codes d'échappement ANSI qui ne sont pas interprétés par défaut. Pour pouvoir lessafficher correctement les couleurs, vous devez utiliser le commutateur -r, ou mieux encore -R:

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.

Alternativement, vous pouvez utiliser morequi affichera les couleurs correctement par défaut.


Si vous ne pouvez pas installer de programmes externes, vous devriez pouvoir obtenir le même résultat en utilisant une approche plus manuelle:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
terdon
la source
1
Et si quelqu'un veut voir le pourcentage des données affichées, il doit utiliser less -RM +Gg: superuser.com/questions/64972/…
baptx
13

Les autres réponses ici pourraient être obsolètes. À partir de coreutils 3.5, vous diffpouvez en effet produire des sorties en couleurs qui sont désactivées par défaut lorsque la sortie standard n’est pas une console.

De la page de manuel:

--color[=WHEN]
coloriser la sortie; WHENpeut être never, alwaysou auto(par défaut)

Pour forcer la sortie couleur lorsque stdout est un tuyau, cela diff --color=always -- "$file1" "$file2" | less -Rdevrait fonctionner.

Kshitiz Sharma
la source
Vous pouvez également inclure alias diff='diff --color=always'dans un fichier .bashrcou .zshrc.
Jftuga le
1
Oui. J'utilisealias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma le
J'utilise alias diff='/usr/bin/diff --color=always 'et alias less='/usr/bin/less -r 'mais bien que le diff soit initialement coloré sur les premières pages de less mais sur les diffs longs, il retourne parfois en mono. Cela pourrait être sur des sauts qui n'affecteraient clairement pas diff, car sa sortie est générée une seule fois et ne doit pas nécessairement sauter, mais perd moins de traces des couleurs.
NeilG
8

Tuyau diff de couleur à moins:

diff $file1 $file2 | colordiff | less -r

Pour le rendre plus lisible, en le limitant à un seul écran:

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

Et, pour que moins de choses ne s'affichent pas s'il n'y a qu'un seul écran de contenu:

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

Le moins -F provoque la fermeture immédiate si moins d'un écran occupe le contenu, le tuyau vers stderr est parce que lorsque vous fermez moins, vous perdez la sortie - si vous passez par stderr, la sortie est sortie même si moins s'affiche.

Une solution alternative (et, je pense, meilleure) consiste à utiliser simplement -X pour éviter de moins effacer l'écran:

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

Cela fonctionne bien pour moi, mais pourrait être spécifique à bash. colordiff n'est pas intégré, mais s'installe facilement.

Benubird
la source
2
La seule commande dont il a besoin estless -r
sendmoreinfo