Me gustaría usar 'diff' para obtener una diferencia entre líneas y caracteres. Por ejemplo, considere:
Archivo 1
abcde
abc
abcccd
Archivo 2
abcde
ab
abccc
Usando diff -u obtengo:
@@ -1,3 +1,3 @@
abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Sin embargo, solo me muestra que hubo cambios en estas líneas. Lo que me gustaría ver es 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
Entiendes mi deriva.
Ahora, sé que puedo usar otros motores para marcar / verificar la diferencia en una línea específica. Pero prefiero usar una herramienta que lo haga todo.
text
command-line
diff
VitalyB
fuente
fuente
Respuestas:
Git tiene una diferencia de palabras, y definir todos los caracteres como palabras efectivamente le da una diferencia de caracteres. Sin embargo, se ignoran los cambios de nueva línea .
Ejemplo
Crea un repositorio como este:
Ahora, hazlo
git diff --word-diff=color --word-diff-regex=. master^ master
y obtendrás:Tenga en cuenta cómo se reconocen tanto las adiciones como las eliminaciones a nivel de personaje, mientras que las adiciones y eliminaciones de nuevas líneas se ignoran.
También puede probar uno de estos:
fuente
git diff --word-diff=color --word-diff-regex=. file1 file2
--no-index
a la respuesta de @ qwertzguys anterior para que funcionara para mí fuera de un repositorio de git. Entonces:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
--no-index
dentro de un repositorioPuedes usar:
colordiff
es un paquete de Ubuntu. Puede instalarlo usandosudo apt-get install colordiff
.diff-highlight
es de git (desde la versión 2.9). Se encuentra en/usr/share/doc/git/contrib/diff-highlight/diff-highlight
. Puede ponerlo en algún lugar de su$PATH
.fuente
brew install colordiff
diff-highlight
en$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
diff-highlight
también se puede instalar con pip de pythonpip install diff-highlight
(lo prefiero incluso si git se instala a través de brew)El difflib de Python es excelente si quieres hacer esto de forma programática. Para uso interactivo, uso el modo diff de vim (lo suficientemente fácil de usar: simplemente invoca vim con
vimdiff a b
). Ocasionalmente también uso Beyond Compare , que hace casi todo lo que podrías esperar de una herramienta de diferencias.No he visto ninguna herramienta de línea de comandos que haga esto de manera útil, pero como señala Will, el código de ejemplo difflib podría ayudar.
fuente
Puede utilizar el
cmp
comando en Solaris:fuente
cmp
también está disponible en (al menos algunas) distribuciones de Linux.-l -b
.Python tiene una biblioteca conveniente nombrada
difflib
que podría ayudar a responder su pregunta.A continuación se muestran dos oneliners que se utilizan
difflib
para diferentes versiones de Python.Estos pueden ser útiles como un alias de shell que es más fácil de mover con su
.${SHELL_NAME}rc
.Y una versión más legible para poner en un archivo independiente.
fuente
Funcionó bien para mí. El número más a la izquierda del resultado indica el número de caracteres que difieren.
fuente
cmp -l file1 file2 | wc -l
También escribí mi propio script para resolver este problema usando el algoritmo de subsecuencia común más largo.
Se ejecuta como tal
JLDiff.py a.txt b.txt out.html
El resultado está en html con coloración roja y verde. Los archivos más grandes requieren exponencialmente una mayor cantidad de tiempo para procesarse, pero esto hace una verdadera comparación carácter por carácter sin verificar línea por línea primero.
fuente
Color, carácter de nivel
diff
ouputEsto es lo que puede hacer con el siguiente script y diff-highlight (que es parte de git):
(Crédito a la respuesta de @ retracile por el
sed
resaltado)fuente
command | gvim -
harás lo que quieras.git
su ruta, pero no en ella. Una de mi máquina en la que vive/usr/share/doc/git/contrib/diff-highlight
.El difflib de Python puede hacer esto.
La documentación incluye un programa de línea de comandos de ejemplo para usted.
El formato exacto no es el que especificó, pero sería sencillo analizar la salida de estilo ndiff o modificar el programa de ejemplo para generar su notación.
fuente
Aquí hay una herramienta de comparación de texto en línea: http://text-compare.com/
Puede resaltar cada carácter que es diferente y continúa comparando el resto.
fuente
catdog
ycat\ndog
solo coincidirá encat
Creo que la solución más simple es siempre una buena solución. En mi caso, el siguiente código me ayuda mucho. Espero que ayude a alguien más.
Puede comparar dos archivos con la siguiente sintaxis en su terminal favorito:
fuente
Si mantiene sus archivos en Git, puede diferenciar entre versiones con el script diff-highlight , que mostrará diferentes líneas, con las diferencias resaltadas.
Desafortunadamente, solo funciona cuando la cantidad de líneas eliminadas coincide con la cantidad de líneas agregadas; hay un código auxiliar para cuando las líneas no coinciden, por lo que presumiblemente esto podría solucionarse en el futuro.
fuente
No es una respuesta completa, pero si
cmp -l
la salida no es lo suficientemente clara, puede usar:fuente
La mayoría de estas respuestas mencionan el uso de diff-highlight , un módulo de Perl. Pero no quería averiguar cómo instalar un módulo Perl. Así que hice algunos cambios menores para que fuera un script Perl autónomo.
Puedes instalarlo usando:
Y el uso (si tiene el Ubuntu
colordiff
mencionado en la respuesta de zhanxw):Y el uso (si no lo hace):
fuente
ccdiff
es una práctica herramienta dedicada a la tarea. Así es como se ve su ejemplo con él:De forma predeterminada, resalta las diferencias de color, pero también se puede usar en una consola sin soporte de color.
El paquete está incluido en el repositorio principal de Debian:
fuente