Como colorir a saída diff?

18

Eu queria formatar os arquivos Unix condicionalmente, atualmente estou trabalhando no diffcomando e queria saber se é possível formatar o texto da diffsaída do comando.

Exemplo:

Os valores correspondentes devem ser exibidos em verde.
Valores incomparáveis ​​devem ser exibidos em vermelho.

Suponha que eu tenho dois arquivos file1e file2e meu comando édiff file1 file2 .

Agora eu queria que suponha que a saída contenha 5 incompatibilidades, em seguida, essas incompatibilidades devem ser exibidas na cor vermelha. Como conseguir isso usando o unix?

Em resumo "Altere a cor para vermelho para a saída do comando diff para valores que não correspondem"

Um homem
fonte
2
Possível duplicata de esta
FloHimself
Os termos "match" e "mismach" são um pouco confusos. De qualquer forma, existe a opção --color agora no diff 3.4 e posterior.
Gerry Lufwansa

Respostas:

23

diff --color opção foi adicionada GNU diffutils 3.4 (08-08 2016)

Essa é a diffimplementação padrão na maioria das distribuições, que em breve será obtida.

No 3.5, é assim:

insira a descrição da imagem aqui

com:

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

Também solicitei diff de nível de palavra a partir de diff-highlight: [Diffutils-devel] Adicione um sinalizador para produzir saída colorida como diff-h do git | lists.gnu.org

Aparentemente adicionado ao commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (março de 2015).

Ciro Santilli adicionou uma nova foto
fonte
1
Excelente! Para habilitar isso por padrão: alias diff='diff --color=auto'
Tom Hale
1
Aqui está a documentação.
Alex12
19

Se você tiver acesso ao GNU, diffpoderá usar suas --X-group-formatopções para obter esse efeito sem nenhuma ferramenta 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

Que usa códigos de escape de cores ANSI para ficar vermelho e verde, com ANSI-C entre aspas no shell para acessar os \eescapes.

--old-group-formate --new-group-formatidentificar linhas não correspondentes e inseri-los entre os códigos de reset vermelhos e de cor utilizando %<e %>, enquanto --unchanged-group-formatinserções correspondentes linhas entre códigos de verde e de reinicialização.

Você também pode usar--old-line-format (etc), à custa de fugas cor redundantes em cada linha: --old-line-format=$'\e[0;31m%L\e[0m'.

Michael Homer
fonte
quando executo, dá diff: 0653-821 opção ilegal - - diff: 0653-821 opção ilegal - o diff: 0653-821 opção ilegal - d diff: 0653-821 opção ilegal - - diff: 0653-821 opção ilegal - g diff: 0653-821 opção ilegal - o como erros.
Aman
Hormer, quando estou executando seus comandos, uma linha de cada vez está dando saída para a nova linha -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman
Posso configurar isso por padrão?
Eugen Konkov
@EugenKonkov Você pode configurar um alias ou função no seu shell para executar isso diff.
Michael Homer
Isso me deu um pouco de dificuldade para fazê-lo funcionar. Material inalterado foi aparecendo como adicionado ... desistiu e instalado colordiff
Brian Peterson
9

Experimentar colordiff file1 file2

Disponibilidade do colordiff com sua distribuição Linux / BSD

Aqueles que executam Debian ou Ubuntu (ou qualquer um de seus derivados) provavelmente podem apenas usar o "apt-get install colordiff" para baixar e instalar; O colordiff também é fornecido para várias outras distribuições e sistemas operacionais Linux, UNIX e BSD.

(Citação de http://www.colordiff.org/ )

modesto
fonte
1
Perfeito. Para mim, diff --color=autosó foi colourising marcadores de linha e a primeira linha de cada +/ -seção. A tubulação less -SRfacilita a navegação.
Walf
4

Colorido, palavra de nível diff ouput

Aqui está o que você pode fazer com o script abaixo e o diferencial :

Captura de tela colorida 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

(Agradecemos a resposta de @ retracile pelo seddestaque)

Tom Hale
fonte
1

Você deve dar uma olhada no hlcomando disponível no github: git clone http://github.com/mbornet-hl/hl e em: http://www.flashnux.com/notes/page_000022_US.html

hlé um comando do Linux escrito em C, especialmente projetado para colorir um arquivo de texto ou a saída de um comando. Você pode usar até 42 cores simultaneamente e usar um arquivo de configuração para simplificar as linhas de comando. Você pode colorir a saída de cada comando que pode ser canalizado para outro. E se você souber o que são expressões regulares, será muito fácil usá-lo. Você pode usar a manpágina para entender como usá-la.
hlé muito fácil de usar e configurar. Você ainda pode usar o script hl_generic para colorir a saída dos comandos sem modificar sua sintaxe.
Você pode, por exemplo, colorir a saída do diffcomando digitando seu comando usual:

diff file1 file2

Se precisar de ajuda, envie-me um e-mail.
Saudações.

maternidade
fonte
1

Existe uma ferramenta realmente interessante criada com o python no Github no momento chamada icdiff. Produz impressões coloridas agradáveis, que também são sensíveis à "gravidade". Eu uso o tempo todo, vale a pena conferir.

Joe Healey
fonte
0

Ou você pode usar

1diff --color=auto file1 file2

2)colordiff file1 file2

3.My Favorite: git diff file1 file2implementado como abaixo:

Atualmente, eu uso e recomendo que você use git diff ou envie sua saída colordiffusando:

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

himanshuxd
fonte
Também gosto, git diff --no-indexmas acho que os arquivos precisam ser procurados. (Pelo menos, não funciona com substituição processo de festa para mim)
Karl
@Karl Figura que se destaca, talvez exista uma configuração do Terminal que faça (ou) alguma outra maneira de torná-lo possível. Estou usando git diffhá muito tempo e o arquivo é procurável para mim, caso contrário não haveria utilidade em fazê-lo corretamente.
himanshuxd
2
Talvez eu não tenha sido muito clara. Como um exemplo (bobo), isso funciona para mim, diff --color <(ls | head -n+3) <(ls | tail -n +5)mas não com git diff. É certo que não é um caso comum ou muito difícil de contornar.
Karl
0

Apenas uma observação: para obter a saída "lado a lado", você precisa "--color = always". Você também pode paginar com menos e manter a saída colorida:

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

E ainda outra dica: tente manter a opção "--color = always" no final. Razão? Com o dmesg do util-linux 2.27.1:

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

Este script usa o diff padrão anterior à versão 3.4 (deve funcionar com qualquer versão do diff) e colorir a saída sem alterar o formato da saída. Ele funciona com a versão mais recente do RHEL (versão 7.5), que possui a versão 3.3 do GNU diff. Basta colocá-lo no diretório ~ / bin ou em qualquer outro lugar do seu caminho (sugiro chamá-lo de "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
fonte
0

Se você tiver o vim instalado, poderá fazer diff file1 file2 | vim -

O Vim reconhecerá o formato diff e fornecerá uma coloração adequada. O traço no final é permitir que o vim aceite a entrada do comando diff.

TrongBang
fonte
'view' (o atalho somente leitura para vim) é mais adequado para essa finalidade.
Anupam Srivastava
0

Diferença de cor no nível do caractere: Instale o ccdiff

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

Saída de ccdiff

Damasco
fonte