¿Cómo puedo obtener diff para mostrar solo líneas agregadas y eliminadas? Si diff no puede hacerlo, ¿qué herramienta puede?
command-line-interface
diff
Cruzar
fuente
fuente
diff A B | grep '^[<>]'
comm
.Respuestas:
Prueba comm
Otra forma de verlo:
Mostrar líneas que solo existen en el archivo a: (es decir, lo que se eliminó de a)
Mostrar líneas que solo existen en el archivo b: (es decir, lo que se agregó a b)
Mostrar líneas que solo existen en un archivo u otro: (pero no en ambos)
(Advertencia: si el archivo
a
tiene líneas que comienzan con TAB, se eliminará de la salida (la primera TAB).Solo archivos ordenados
NOTA: Ambos archivos deben ser ordenados para
comm
trabajar correctamente. Si aún no están ordenados, debe ordenarlos:Si los archivos son extremadamente largos, esto puede ser una gran carga ya que requiere una copia adicional y, por lo tanto, el doble de espacio en disco.
fuente
comm -12 <(sort a) <(sort b)
comm
podría hacer lo que quieras. Desde su página de manual:Estas columnas se pueden suprimir con
-1
,-2
y-3
respectivamente.Ejemplo:
Y si solo quieres las líneas únicas y no te importa en qué archivo están:
Como dice la página del manual, los archivos deben ordenarse de antemano.
fuente
Para mostrar adiciones y eliminaciones sin contexto, números de línea, +, -, <,>! etc, puedes usar diff así:
Por ejemplo, dados dos archivos:
a.txt
b.txt
El siguiente comando mostrará líneas eliminadas de ao agregadas a b:
salida:
Este comando ligeramente diferente mostrará líneas eliminadas de a.txt:
salida:
Finalmente, este comando mostrará líneas agregadas a a.txt
salida
fuente
Eso es lo que hace diff por defecto ... ¿Quizás necesite agregar algunas banderas para ignorar los espacios en blanco?
debe ignorar líneas en blanco y diferentes números de espacios.
fuente
No, en
diff
realidad no muestra las diferencias entre dos archivos en la forma en que uno podría pensar. Produce una secuencia de comandos de edición para una herramienta comopatch
para cambiar un archivo a otro.La dificultad para cualquier intento de hacer lo que está buscando es cómo definir qué constituye una línea que ha cambiado frente a una eliminada seguida de una añadida. También qué hacer cuando se agregan, eliminan y cambian líneas adyacentes entre sí.
fuente
diff
fuentes, pero parece recordar todo tipo de giros para hacer un seguimiento de dónde coinciden dos archivos para mantenerse sincronizados y creo que hay un umbral para renunciar en función de qué tan separados están las líneas son Pero no recuerdo ninguna coincidencia intralínea, excepto (opcionalmente) el espacio en blanco colapsado o el caso ignorado. O (tal vez) palabras a ese efecto. En cualquier caso, se trata de todopatch
y "vgrep" simplemente aparece para el viaje. Tal vez. El martes.Las herramientas de comparación visual ajustan dos archivos juntos para que un segmento con el mismo número de líneas pero contenido diferente se considere un segmento cambiado. Las líneas completamente nuevas entre segmentos coincidentes se consideran segmentos agregados.
Así es también como funciona la herramienta de línea de comandos sdiff , que muestra una comparación lado a lado de dos archivos en un terminal. Las líneas modificadas están separadas por | personaje. Si solo existe una línea en el archivo A, <se utiliza como carácter separador. Si existe una línea solo en el archivo B,> se usa como separador. Si no tiene caracteres <y> en los archivos, puede usar esto para mostrar solo las líneas agregadas:
fuente
Gracias senarvi, su solución (no votada) en realidad me dio EXACTAMENTE lo que quería después de buscar años en una tonelada de páginas.
Usando su respuesta, esto es lo que se me ocurrió para cambiar / agregar / eliminar la lista de cosas. El ejemplo utiliza 2 versiones del archivo / etc / passwd e imprime el nombre de usuario para los registros relevantes.
fuente
Encuentro esta forma particular a menudo útil:
Ejemplo:
Salida:
Por lo tanto, muestra líneas antiguas
-
seguidas inmediatamente por la nueva línea correspondiente con+
.Si tuvimos una eliminación de
C
:se parece a esto:
El formato está documentado en
man diff
:y:
y:
Pregunta relacionada: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Probado en Ubuntu 18.04.
fuente
Archivo1:
Archivo2:
Utilizar:
Esto muestra dos columnas para archivos de referencias.
Salida:
fuente