2010-04-09 19 views
14

¿Alguien sabe de una herramienta diff-like que me puede mostrar los cambios entre dos archivos de texto, pero ignora los cambios en los espacios en blanco incluyendo newlines?newline-ignooring diff/diff en múltiples líneas/reflow-ignooring diff

He aquí un ejemplo:

 
the quick brown fox jumped over the lazy bear. the quick brown fox 
jumped over the lazy bear. the quick brown fox jumped over the lazy 
bear. the quick brown fox jumped over the lazy bear. 
 
quick brown fox jumped over the lazy bear. the quick brown fox jumped 
over the lazy bear. the quick brown fox jumped over the lazy bear. 
the quick brown fox jumped over the lazy bear. 

único que hice fue eliminar una palabra y reflujo, pero "diff -b" detecta un cambio en cada línea (como debe ser, no estoy diciendo que esto es un error en diff). Pero para grandes archivos LaTeX, este es un problema importante; cambia una palabra en un párrafo largo y la diferencia que obtienes es básicamente inútil.

Por cierto, soy consciente de que esto requiere mucho más poder computacional que las diferencias line-are-atomic habituales. Solo estoy haciendo esto en pequeños archivos generados por humanos y estoy feliz de esperar un largo tiempo si es necesario.

Respuesta

11

wdiff alinea palabra por palabra.

Para una pantalla fácil de leer en un terminal, ejecute

wdiff -al <file1> <file2> | less 

Esto mostrará (al menos en mi sistema) inserciones en <file2> en negrita y las supresiones de <file2> subrayados.

+0

ADVERTENCIA: wdiff puede no estar disponible en todos los sistemas. Pero es una utilidad genial – DVK

+0

¡Hurra! Eso es exactamente lo que quería. Ahora solo tengo que esperar al desbordamiento de pila para que pueda declarar la respuesta. – Adam

+0

Aunque wdiff es genial, en realidad lo estoy rebajando por dos razones: en primer lugar, wdiff no muestra los números de línea de los diffs encontrados (gran inconveniente); y segundo, porque está orientado a las palabras, no puede ignorar los cambios en el espacio en blanco (es decir, 'foreach (' vs 'foreach ('). He escrito un script PHP para compensar el segundo problema, pero sin números de línea es un enorme pérdida de tiempo tratando de grep para encontrar las diferencias "interesantes". Tenía la esperanza de decir algo bueno sobre la comparación ++, pero todavía tengo que escuchar de ellos si tienen un .rpm – Jeff

1

Una opción es hacer esto dividiendo el archivo completo en palabras. No es el 100% el mismo resultado en términos de conocer el contexto pero muy ajustado al tipo de cambio que te interesa.

Ejemplo:

cat file1 | perl5.8 -e '{s/\s+/\n/g;}' > file1.split_words 
cat file2 | perl5.8 -e '{s/\s+/\n/g;}' > file2.split_words 
diff file1.split_words file2.split_words 

Puede hacerlo aún mejor si el texto tiene Properies especiales, para ser más específicos, el reflujo sólo ocurre dentro de los límites de un párrafo que se define como 2 nuevas líneas en una fila - simplemente reemplace todas las nuevas líneas por espacios y ejecute regularmente diff -w en los resultados.