Diff informa diferencia pero ambas líneas son iguales

55

Difundí 2 archivos y obtuve

1c1
< 1
---
> 1

Ambos archivos contenían solo "1". ¿Cómo es esto diferente?

Jiew Meng
fuente
publicar el contenido de ambos archivos, por favor;)
Rinzwind
55
Si está utilizando diff, la -uopción puede ser más legible para los humanos.
Lekensteyn
@Rinzwind, ambos archivos contienen solo el texto 1, pero si quieres ver más mira pastebin.com/byiqdie1
Jiew Meng
Lo siento. No lo hace cuando hago eso. Debe haber algo diferente. Haga un cp 1 2(sobrescriba 2) y luego puede estar 100% seguro de que son iguales;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc

Respuestas:

68

Primera línea: asignifica agregado, deliminado y cmodificado. Los números de línea del archivo original aparecen antes de estas letras y los del archivo modificado aparecen después de la letra.

2da línea: la línea con <es del archivo 1 y es diferente del archivo 2.

La tercera línea es un divisor.

4ta línea: la línea con >es del archivo 2 y es diferente del archivo 1.

(Si alguna vez lo ve =significa que las líneas son las mismas en ambos archivos)

Y su problema podría ser espacios en blanco u otros caracteres legibles no humanos: esos también provocan una diferencia.

Hay algunas opciones para manipular la salida.

Ejemplo:

rinzwind @ discworld: ~ $ más 1 
prueba
prueba2
prueba3
rinzwind @ discworld: ~ $ más 2
prueba
prueba2  
prueba3

formato contextualizado:

rinzwind @ discworld: ~ $ diff -c 1 2
*** 1 2011-08-13 17: 05: 40.433966684 +0200
--- 2 2011-08-13 17: 11: 24.369966629 +0200
***************
*** 1,3 ****
  prueba
! prueba2
  prueba3
--- 1,3 ----
  prueba
! prueba2  
  prueba3

UNA "!" representa un cambio entre líneas que se corresponden en los dos archivos. Un "+" representa la adición de una línea, mientras que un espacio en blanco representa una línea sin cambios. Al comienzo del parche se encuentra la información del archivo, incluida la ruta completa y una marca de tiempo. Al comienzo de cada trozo están los números de línea que se aplican para el cambio correspondiente en los archivos. Un rango de números que aparece entre conjuntos de tres asteriscos se aplica al archivo original, mientras que los conjuntos de tres guiones se aplican al nuevo archivo. Los rangos de trozos especifican los números de línea inicial y final en el archivo respectivo.

Ampliando el comentario de Lekensteyn sobre el formato unificado:

rinzwind @ discworld: ~ $ diff -u 1 2
--- 1 2011-08-13 17: 05: 40.433966684 +0200
+++ 2 2011-08-13 17: 11: 24.369966629 +0200
@@ -1,3 +1,3 @@
 prueba
-test2
+ test2  
 prueba3

El formato comienza con el mismo encabezado de dos líneas que el formato de contexto, excepto que el archivo original está precedido por "---" y el nuevo archivo está precedido por "+++". Después de esto, hay uno o más trozos de cambio que contienen las diferencias de línea en el archivo. Las líneas contextuales no modificadas están precedidas por un carácter de espacio, las líneas de adición están precedidas por un signo más y las líneas de eliminación están precedidas por un signo menos.

Algunas opciones útiles:

-b Ignorar los cambios en la cantidad de espacio en blanco.

-w Ignora todos los espacios en blanco.

-B Ignora todas las líneas en blanco.

-y salida en 2 columnas.

Rinzwind
fuente
¿Cómo verifico si hay caracteres ocultos? ¿Hay alguna forma de ignorar los caracteres ocultos (tal vez solo excluyendo nuevas líneas y pestañas?) Supongo que la mayoría de los caracteres ocultos son accidentales?
Jiew Meng
Puse algunas opciones útiles (copiado de man diff;))
Rinzwind
Noto que el uso de la bandera -b funciona. Hmm no veo diferencia en el espacio en blanco en gedit :)
Jiew Meng
@JiewMeng Ejecutar od -x1zen ambos archivos y comparar odresultados. Debería encontrar cualquier diferencia oculta entre los archivos.
lgarzo
6

Me parece que od (volcado octal) es útil cuando se comparan archivos con caracteres no imprimibles (particularmente los archivos que diff decide que son "binarios" y, por lo tanto, solo le dice que sí difieren).

En el siguiente ejemplo, creo un par de archivos que podrían ser como los originales, luego hago una diferencia con la salida original; a continuación hago diff en un par de salidas "od" diferentes.

$ echo 1> 1
$ echo "1"> 2
$ diff 1 2

1c1  
< 1  
- ---  
> 1   

$ od -c 1> 1.od
$ od -c 2> 2.od
$ diff 1.od 2.od

1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003

$ od -Ax -c -t x1 1> 1.od
$ od -Ax -c -t x1 2> 2.od
$ diff 1.od 2.od

1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003
Charles Boling
fuente
1

Tuve el mismo problema y encontré una solución que podría ayudar, use el comando:

dos2unix <file1> <file2>

uno de ellos puede estar en formato dos / windows y el otro formato UNIX

Después de hacer esto, ¡la diferencia fue buena!

levk
fuente