Todas las herramientas de diff que he encontrado están comparando línea por línea en lugar de char por char. ¿Hay alguna biblioteca que dé detalles sobre cadenas de una sola línea? Tal vez también una diferencia porcentual, aunque supongo que hay funciones separadas para eso.diff para líneas simples
Respuesta
Este algoritmo diffs palabra por palabra:
http://github.com/paulgb/simplediff
disponibles en Python y PHP. Incluso puede escupir salida con formato HTML utilizando las etiquetas <ins>
y <del>
.
Bueno, pero el espacio en blanco también debería ser importante. Una pestaña reemplazada por un espacio sería una diferencia no detectada por esto. –
El código fuente parece bastante simple. Puedes cambiarlo fácilmente para dividirlo en una cadena vacía en lugar de en un espacio en blanco para que puedas diferenciar carácter por carácter. – slebetman
En realidad, este funciona increíble, pasando las cadenas directamente a diff() en lugar de a través de stringDiff(). Funciona muy bien en una base de char por char, porque las cadenas son secuencias en python. Y la salida de la función es fácil de trabajar también. Sin embargo, me pregunto sobre los gastos generales de buscar la subcadena común más grande, cuando cada elemento tiene solo un carácter ... aunque es posible que esté malinterpretando el código ... –
Lo que podría intentar es dividir ambas cadenas carácter por carácter en líneas y luego puede usar diff en eso. Es un truco sucio, pero al menos debería funcionar y es bastante fácil de implementar.
Alternativamente, puede dividir la cadena en una lista de caracteres en Python y usar difflib. Comprobar Python difflib reference
Pensé en esto y parece ser la "mejor" opción hasta ahora. También consideré buscar en las herramientas de línea de diferencia e intentar que tratara a los caracteres como líneas ... pero pensé que primero verificaría. –
Eso se puede hacer fácilmente 'diff <(cat file1 | tr" "" \ n ") <(cat fil2 | tr" "" \ n ")' pero el problema es que la salida está mal formateada. Mucho mejor que hacer 'archivo wdiff1 archivo2' Gracias a @Michael Williamson respuesta. –
Aquí hay una versión de carácter por carácter 'diff <(cat a1 | sed 's /./ \ 0 \ n /' g) <(cat a2 | sed 's /./ \ 0 \ n /' g) ' –
Estaba buscando algo similar recientemente, y encontré wdiff. Funciona con palabras, no con personajes, ¿pero está tan cerca de lo que estás buscando?
Bueno, pero el espacio en blanco debería importar también. Una pestaña reemplazada por un espacio sería una diferencia no detectada por esto (si está dividida por espacios en blanco). –
wdiff parece abandonado desde 1994. funciona, principalmente. – lhf
@lhf, ¿está abandonado o simplemente no hay mucho para mejorar? –
Puede implementar un simple Needleman-Wunsch algoritmo. El pseudo código está disponible en Wikipedia: http://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm
- 1. newline-ignooring diff/diff en múltiples líneas/reflow-ignooring diff
- 2. git diff - manejo de líneas largas?
- 3. cómo mostrar líneas en común (diff inverso)?
- 4. Es echo atomic al escribir líneas simples
- 5. deshacer DIFF puso al copiar líneas entre ventanas vimdiff
- 6. Python - líneas simples de lectura de una tubería
- 7. Git Diff - Cómo revertir líneas o fragmentos seleccionados
- 8. Atajos de teclado para P4 Diff/P4 Carpeta Diff
- 9. Cómo configurar 'git diff' para usar emacs diff
- 10. Cómo obtener diff para informar el resumen de líneas nuevas, modificadas y eliminadas
- 11. Programas gráficos DIFF para Linux
- 12. svn diff para un archivo completo?
- 13. Git diff --stat explicación
- 14. Valor porcentual con GNU Diff
- 15. ¿Cómo hacer que diff funcione como git-diff?
- 16. Perforce pendiente diff secuencia de comandos diff
- 17. line-end agnostic diff?
- 18. git diff --word-diff con archivos en línea
- 19. algoritmos Diff
- 20. tf diff
- 21. ¿Hay alguna manera de agregar líneas de presentación de git, cambiar líneas y eliminar líneas?
- 22. git diff única para fusionar cometer
- 23. Subversion diff para el archivo xml comprimido
- 24. Obtener git diff para cualquier rama fusionada
- 25. Utilice siempre el localizador para git diff
- 26. Reemplazo de diff() para columnas múltiples
- 27. SVN: Crear un diff para muchas revisiones
- 28. C# Algoritmo Diff para el texto
- 29. Diff Algorithm
- 30. Herramienta adecuada para interfaces XML simples
¿No es este un duplicado de http://stackoverflow.com/questions/1721738/using-diff-or-anything-else-to-get-character-level-diff -between-text-files? –