Estoy tratando de entender el comando linux diff en dos archivos cuyas líneas son solo permutación entre sí pero no pueden asimilar el resultado que genera. Considere los tres comandos a continuación:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
¿Alguien puede explicar el resultado críptico anterior de diff.
- ¿Por qué no hay mención alguna de "naranjas" en la salida?
- ¿Qué significa
1d0
y qué2a2
significa?
Entiendo por esta respuesta que:
"<" significa que falta la línea en el archivo2 y ">" significa que falta la línea en el archivo1
PERO eso no explica por qué faltan naranjas en la salida.
oranges
es la parte común más grande entre los dos archivos, lo que obtienes es la forma más corta de expresar las diferencias entre los dos.diff -u file1 file2
en su lugar. Eso se llama formato "diff unificado". El formato diff original estaba destinado a ser muy compacto, pero los diff unificados están destinados a ser mucho más legibles.diff -y file1 file2
Respuestas:
Para comprender el informe, recuerde que
diff
es prescriptivo y describe los cambios que se deben realizar en el primer archivo (file1
) para que sea el mismo que el segundo archivo (file2
).Específicamente, el
d
in1d0
significa eliminar y ela
in2a2
significa agregar .Así:
1d0
significa que la línea 1 debe eliminarse enfile1
(apples
).0
en1d0
significa que la línea 0 es donde habrían aparecido en el segundo archivo (file2
) si no se hubieran eliminado. Eso significa que cuando se cambiafile2
afile1
(hacia atrás), agregue la línea 1file1
después de la línea 0 defile2
.2a2
significa agregar la segunda línea (oranges
)file2
a la ahora segunda línea defile1
(después de eliminar la primera líneafile1
,oranges
cambiar a la línea 1)fuente
0
en1d0
?Considere estos archivos:
file1
:file2
:Cómo
diff
funciona, dado que está basado en pedidos:diff
lee el primer bloque de líneas defile1
yfile2
, e intenta encontrar líneas iguales:Ahora omitirá todas las líneas que son iguales en ambos archivos, que es solo
oranges
en este caso:Ahora encuentre otro conjunto de líneas similares e imprima las diferencias:
Salta las líneas similares
Encuentre líneas idénticas, si es posible, e imprima diferencias:
Ahora si lo hago
diff file1 file2
:Ahora es simple explicar lo que
diff
significa la salida:Para hacer
file1
igual afile2
:1,2d0
: Eliminar (d
) líneas1-2
defile1
y modificar la línea0
enfile2
consecuencia3a2
: Añadir (a
) a la línea3
defile1
línea2
defile2
4a4,5
: Añadir a la línea4
defile1
líneas4-5
defile2
diff
se comparafile1
confile2
línea por línea y resuelve diferencias en la memoria temporal. Después de hacerfile1
igual afile2
hasta la primera aparición de una línea enfile1
, que también ocurre enfile2
, todas las líneas que son iguales hasta una diferencia no se mencionan, a menudo se indican como---
. En este caso solo hay una línea similar, que esoranges
. Tenga en cuenta que dijefile1
igual afile2
, por lo quefile1
se ve en relación confile2
y no al revés.La salida está en relación con el primer archivo dado, en este caso
file1
.fuente
apples
ocurre en ambos archivos.oranges
". Incorrecto: en realidad hay dos líneas, que no solo son similares , sino absolutamente idénticas . Uno de ellos leeoranges
, el otro leeapples
. Además, su explicación (puramente basada en el orden) está en contradicción con el comentario de Stéphane sobre la pregunta (basada en la longitud): ¿quién tiene razón?Allí están:
fuente
El formato de salida estándar (antiguo) mostrará la diferencia entre los archivos sin texto circundante con áreas donde los archivos difieren.
Por ejemplo:
1d0 <
(eliminar) significa que las manzanas deben eliminarse de la primera línea defile1
, y2a2 >
(agregar) significa que las manzanas deben agregarse enfile2
la segunda línea, por lo que ambos archivos pueden coincidir.La documentación disponible en
info diff
explica más aún más:Ver también:
Entonces, para ver las naranjas, tendrías que diferenciarlas una al lado de la otra o usando un contexto unificado.
Por ejemplo:
fuente