Usando diff en un archivo largo de una línea

Usando diff en un archivo largo de una línea

Tengo un archivo que tiene solo una línea. Su tamaño es de unos 20.000 bytes.

El archivo ha sido modificado y quería saber dónde.

Pensé en usar diff, pero me muestra la línea completa, porque genera la línea que tiene la diferencia, pero en este caso es la única línea del archivo que tiene diferencias.

Entonces quería ver cuál es la diferencia.

¿Algún consejo?

Respuesta1

Suponiendo que hay muchos espacios en blanco, como en el texto normal, puede dividir el archivo por palabras y compararlo con una herramienta de comparación normal, por ejemplo, fusionar:

tr -s ' ' '\n' < file1.txt > file1.txt.split
tr -s ' ' '\n' < file2.txt > file2.txt.split
meld file1.txt.split file2.txt.split

Respuesta2

Encontraría una diferencia que haga diferencias dentro de línea. yo sueloxdiffen UNIX. CreoWinMergehace diferencias intralínea en Windows.

Las otras respuestas también son buenas: wdiff, o dividir en fragmentos: los límites de los fragmentos son más fáciles de definir si los datos están delimitados, por ejemplo, por una barra vertical o una coma.

Respuesta3

Si se trata de un problema puntual, crearía copias de los archivos con \ncaracteres insertados cada 50 caracteres y luego diferenciaría esas copias. (Elegí 50 porque facilita las matemáticas desde un número de línea diferente hasta un desplazamiento de bytes en los archivos originales, pero podría ajustarlo hacia arriba o hacia abajo según lo que encontré).

Respuesta4

Encontré git diffque la --word-diff=porcelainopción es útil para tal tarea, por ejemplo, dados 2 archivos con líneas largas que solo difieren en 1 carácter, la salida se puede canalizar greppara filtrar las líneas modificadas y los cambios, y luego grepnuevamente para mostrar solo los últimos 80 caracteres de cada línea:

echo {1..4000} A {4001..8000} > a.tmp
echo {1..4000} B {4001..8000} > b.tmp

> git diff -U0 --word-diff=porcelain a.tmp b.tmp | grep -A3 '@@' | egrep -o '.{1,80}$'
@@ -1 +1 @@
3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000
-A
+B

información relacionada