Comprensión de la salida diff

89

yo tengo file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

y file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

si lo hago: diff file1.txt file2.txtobtengo:

3d2  
< line3  
5a5  
> GNU is not UNIX  

¿Cómo se interpreta generalmente la salida? Creo que eso <significa eliminado pero ¿qué significa 3d2o qué 5a5?

Si lo hago:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Los resultados son más claros, pero ¿qué @@ -1,5 +1,5 @@significa?

Jim
fuente

Respuestas:

98

En su primera diffsalida (llamada "normall diff") el significado es el siguiente

< - denota líneas en file1.txt

> - denota líneas en file2.txt

3d2e 5a5indica los números de línea afectados y qué acciones se realizaron dsignifica eliminación, asignifica agregar (y csignifica cambiar). el número a la izquierda del carácter es el número de línea en file1.txt, el número a la derecha es el número de línea en file2.txt. Entonces 3d2le dice que la tercera línea en file1.txt fue eliminada y tiene la línea número 2 en file2.txt (o mejor dicho que después de la eliminación, el contador de línea volvió a la línea número 2). 5a5le dice que comenzamos desde la línea número 5 en file1.txt (que en realidad estaba vacía después de eliminar una línea en la acción anterior), agregamos la línea y esta línea agregada es el número 5 en file2.txt.

La salida del diff -ucomando tiene un formato un poco diferente (llamado formato "diff unificado"). Aquí diffnos muestra una sola pieza del texto, en lugar de dos textos separados. En la línea, @@ -1,5 +1,5 @@la parte se -1,5relaciona con file1.txt y la parte +1,5con file2.txt. Nos dicen que diffmostrará un fragmento de texto, que tiene 5 líneas de largo a partir de la línea número 1 en file1.txt. Y lo mismo sobre el archivo2.txt: diffnos muestra 5 líneas a partir de la línea 1.

Como ya he dicho, las líneas de ambos archivos se muestran juntas

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Aquí -denota las líneas, que se eliminaron de file1.txt y +denota las líneas, que se agregaron.

John Smith
fuente
25

Resumen :

Dado a diff file1 file2, <significa que falta la línea file2y >significa que falta la línea file1. El 3d2y 5a5se puede ignorar, son comandos para los patchque a menudo se usa diff.

Respuesta completa :

Muchas utilidades * nix ofrecen manuales de TeXinfo y manpáginas más simples . puede acceder a estos ejecutando info command, por ejemplo info diff. En este caso, la sección que le interesa es:

2.4.2 Descripción detallada del formato normal


El formato de salida normal consta de uno o más trozos de diferencias; cada trozo muestra un área donde los archivos difieren. Los trozos de formato normal se ven así:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

Hay tres tipos de comandos de cambio. Cada uno consta de un número de línea o un rango de líneas separadas por comas en el primer archivo, un solo carácter que indica el tipo de cambio a realizar y un número de línea o un rango de líneas separadas por comas en el segundo archivo. Todos los números de línea son los números de línea originales en cada archivo. Los tipos de comandos de cambio son:

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been
terdon
fuente
4

Sugiero usar:

diff -rupP file1.txt file2.txt > result.patch

Entonces, cuando leas result.patch, instantáneamente sabrás la diferencia.

Estos son los significados de los interruptores de línea de comando:

-r : recursivo

-u : muestra el número de línea

-p (pequeño): muestra diferencias en las funciones de C

-P (capital): en el caso de varios archivos, se muestra la ruta completa

Ravi
fuente
3

Las respuestas anteriores son buenas. Sin embargo, como principiante, los encontré un poco difíciles de entender y al buscar más, encontré un enlace muy útil: Linux Diff Command & Ejemplos

El sitio explica el concepto de una manera simple y fácil de entender.

El comando Diff es más fácil de entender si lo considera de esta manera:

Básicamente, genera un conjunto de instrucciones sobre cómo cambiar un archivo para que sea idéntico al segundo archivo.

Cada uno de los siguientes casos se explican bien:

a para agregar, c para cambiar, d para eliminar

userAsh
fuente
2

¡Cambia el nombre de las cosas para ayudarte a recordar!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

Los resultados operan en el archivo a editar (archivo1), aplicando varias actualizaciones.


Similitud, encuentro estos cambios de nombre útiles para conceptualizar los resultados:

Eliminar = 'eliminar' y Agregar = 'insertar'.

2,4d1 --- D (s) - d -N --- d elete (' eliminar ') D línea (s). Luego sincronice en la línea N en ambos.

4a2,4 --- N- a -U (s) --- En la línea N, a dd (' insertar ') línea (s) de actualización U

Nota: son casi simétricos.


Cambiar = 'eliminar e insertar'.

2,4c5,6 --- R (s) - c -U (s) --- Elimine las líneas R (s), luego inserte las líneas actualizadas U (s) en su lugar.



Por ejemplo:

4a2,4 --- a partir de 4, agregue las líneas actualizadas 2-4 (es decir, 2,4 significa 2, 3 y 4)

2,4d1 --- eliminar líneas 2-4.

2,4c5,6 --- elimine las líneas 2-4 e inserte las líneas actualizadas 5-6


  • Sé que estos son comandos del editor de secuencias y están diseñados para ser procesados ​​por una máquina. Por ejemplo, realmente es el comando ed add, no insert, pero es más útil para mí pensar en insertar, que es lo que al final se está haciendo en el archivo. Utilizan operaciones de flujo, pero me gusta pensar en términos de resultados.

Vista elíptica
fuente