Eu gostaria de usar 'diff' para obter uma diferença de linha e de caractere. Por exemplo, considere:
Arquivo 1
abcde
abc
abcccd
Arquivo 2
abcde
ab
abccc
Usando diff -u eu obtenho:
@@ -1,3 +1,3 @@
abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
No entanto, isso só me mostra que houve mudanças nessas linhas. O que eu gostaria de ver é algo como:
@@ -1,3 +1,3 @@
abcde
-ab<ins>c</ins>
-abccc<ins>d</ins>
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Você me entende.
Agora, eu sei que posso usar outros motores para marcar / verificar a diferença em uma linha específica. Mas prefiro usar uma ferramenta que faça tudo isso.
text
command-line
diff
VitalyB
fonte
fonte
Respostas:
Git tem uma palavra diff, e definir todos os caracteres como palavras efetivamente dá a você uma diff de caractere. No entanto, as alterações de nova linha são ignoradas .
Exemplo
Crie um repositório como este:
Agora, faça
git diff --word-diff=color --word-diff-regex=. master^ master
e você obterá:Observe como as adições e exclusões são reconhecidas no nível do caractere, enquanto as adições e exclusões de novas linhas são ignoradas.
Você também pode tentar um destes:
fonte
git diff --word-diff=color --word-diff-regex=. file1 file2
--no-index
a resposta @qwertzguys acima para fazê-lo funcionar para mim fora de um repositório git. Então:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
--no-index
dentro de um repo tambémVocê pode usar:
colordiff
é um pacote Ubuntu. Você pode instalá-lo usandosudo apt-get install colordiff
.diff-highlight
é do git (desde a versão 2.9). Ele está localizado em/usr/share/doc/git/contrib/diff-highlight/diff-highlight
. Você pode colocá-lo em algum lugar do seu$PATH
.fonte
brew install colordiff
diff-highlight
em$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
diff-highlight
também pode ser instalado com o pip do python -pip install diff-highlight
(eu prefiro mesmo que o git seja instalado via brew)O difflib do Python é ace se você quiser fazer isso programaticamente. Para uso interativo, eu uso o modo diff do vim (fácil de usar: basta invocar o vim com
vimdiff a b
). Ocasionalmente, também uso o Beyond Compare , que faz praticamente tudo o que você poderia esperar de uma ferramenta diff.Não vejo nenhuma ferramenta de linha de comando que faça isso de forma útil, mas, como Will observa, o código de exemplo difflib pode ajudar.
fonte
Você pode usar o
cmp
comando no Solaris:fonte
cmp
também está disponível em (pelo menos algumas) distribuições Linux.-l -b
.Python tem uma biblioteca conveniente chamada
difflib
que pode ajudar a responder sua pergunta.Abaixo estão dois oneliners usando
difflib
para diferentes versões de python.Eles podem ser úteis como um alias de shell, que é mais fácil de mover com o seu
.${SHELL_NAME}rc
.E uma versão mais legível para colocar em um arquivo autônomo.
fonte
Funcionou bem para mim. O número mais à esquerda do resultado indica o número de caracteres que diferem.
fonte
cmp -l file1 file2 | wc -l
Também escrevi meu próprio script para resolver esse problema usando o algoritmo de subsequência comum Longest.
É executado como tal
JLDiff.py a.txt b.txt out.html
O resultado é em html com coloração vermelha e verde. Arquivos maiores levam exponencialmente mais tempo para serem processados, mas isso faz uma comparação verdadeira de caractere por caractere sem verificar linha por linha primeiro.
fonte
Colorido, personagem de nível
diff
ouputAqui está o que você pode fazer com o script abaixo e o diff-realce (que faz parte do git):
(Crédito para a resposta de @retracile pelo
sed
destaque)fonte
command | gvim -
vai fazer o que você quiser.git
mas não colocado em seu caminho. Uma máquina em que vive/usr/share/doc/git/contrib/diff-highlight
.O difflib do Python pode fazer isso.
A documentação inclui um programa de linha de comando de exemplo para você.
O formato exato não é o especificado, mas seria simples analisar a saída no estilo ndiff ou modificar o programa de exemplo para gerar sua notação.
fonte
Aqui está uma ferramenta de comparação de texto online: http://text-compare.com/
Ele pode destacar cada caractere diferente e continua a comparar o resto.
fonte
catdog
ecat\ndog
só corresponderá emcat
Acho que a solução mais simples é sempre uma boa solução. No meu caso, o código abaixo me ajuda muito. Espero que ajude mais alguém.
Você pode comparar dois arquivos com a seguinte sintaxe em seu terminal favorito:
fonte
Se você mantiver seus arquivos no Git, você pode diferenciar entre as versões com o script diff-highlight , que mostrará diferentes linhas, com as diferenças destacadas.
Infelizmente, isso só funciona quando o número de linhas removidas corresponde ao número de linhas adicionadas - há um código de stub para quando as linhas não correspondem, portanto, presumivelmente, isso poderá ser corrigido no futuro.
fonte
Não é uma resposta completa, mas se
cmp -l
a saída não for clara o suficiente, você pode usar:fonte
A maioria dessas respostas menciona o uso de diff-realce , um módulo Perl. Mas eu não queria descobrir como instalar um módulo Perl. Portanto, fiz algumas pequenas alterações para que fosse um script Perl autocontido.
Você pode instalá-lo usando:
E o uso (se você tiver o Ubuntu
colordiff
mencionado na resposta de zhanxw):E o uso (se você não fizer):
fonte