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^ mastery 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-indexa 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-indexdentro de un repositorioPuedes usar:
colordiffes un paquete de Ubuntu. Puede instalarlo usandosudo apt-get install colordiff.diff-highlightes 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 colordiffdiff-highlighten$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlightdiff-highlighttambié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
cmpcomando en Solaris:fuente
cmptambién está disponible en (al menos algunas) distribuciones de Linux.-l -b.Python tiene una biblioteca conveniente nombrada
difflibque podría ayudar a responder su pregunta.A continuación se muestran dos oneliners que se utilizan
difflibpara 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 -lTambié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.htmlEl 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
diffouputEsto 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
sedresaltado)fuente
command | gvim -harás lo que quieras.gitsu 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
catdogycat\ndogsolo coincidirá encatCreo 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 -lla 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
colordiffmencionado en la respuesta de zhanxw):Y el uso (si no lo hace):
fuente
ccdiffes 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