Comprensione dell'output diff


89

io ho file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

e file2.txt

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

se lo faccio: diff file1.txt file2.txtottengo:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Come viene generalmente interpretato l'output? Penso che ciò <significhi essere rimosso, ma che cosa significa 3d2o cosa 5a5significa?

Se lo faccio:

$ 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  

I risultati sono più chiari ma cosa @@ -1,5 +1,5 @@significa?

Risposte:


98

Nel tuo primo diffoutput (il cosiddetto "diff normale") il significato è il seguente

< - indica le righe in file1.txt

> - indica le righe in file2.txt

3d2e 5a5indica i numeri di riga interessati e quali azioni sono state eseguite. dsta per cancellazione, asta per aggiungere (e csta per cambiare). il numero a sinistra del carattere è il numero di riga in file1.txt, il numero a destra è il numero di riga in file2.txt. Quindi 3d2ti dice che la terza riga in file1.txt è stata eliminata e ha il numero di riga 2 in file2.txt (o meglio dire che dopo l'eliminazione il contatore di riga è tornato alla riga numero 2). 5a5ti dice che siamo partiti dalla riga numero 5 in file1.txt (che era effettivamente vuota dopo che abbiamo eliminato una riga nell'azione precedente), ha aggiunto la riga e questa riga aggiunta è il numero 5 in file2.txt.

L'output del diff -ucomando è formattato in modo leggermente diverso (il cosiddetto formato "unified diff"). Qui diffci mostra un singolo pezzo del testo, invece di due testi separati. Nella riga @@ -1,5 +1,5 @@la parte si -1,5riferisce a file1.txt e la parte +1,5a file2.txt. Ci dicono che diffmostrerà un pezzo di testo, che è lungo 5 righe a partire dalla riga numero 1 in file1.txt. E lo stesso per il file2.txt: diffci mostra 5 righe a partire dalla riga 1.

Come ho già detto, le linee di entrambi i file sono mostrate insieme

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

Qui -indica le linee, che sono state eliminate da file1.txt e +le linee che sono state aggiunte.


25

Riepilogo :

Dato un diff file1 file2, <significa che la linea è mancante file2e >significa che la linea è mancante file1. Gli 3d2e 5a5possono essere ignorati, sono comandi per i patchquali viene spesso utilizzato diff.

Risposta completa :

Molte utility * nix offrono manuali TeXinfo e manpagine più semplici . puoi accedervi eseguendo info command, ad esempio info diff. In questo caso, la sezione che ti interessa è:

2.4.2 Descrizione dettagliata del formato normale


Il normale formato di output è costituito da uno o più blocchi di differenze; ogni pezzo mostra un'area in cui i file differiscono. Gli hunk di formato normale si presentano così:

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

Esistono tre tipi di comandi di modifica. Ciascuno è costituito da un numero di riga o da un intervallo di righe separate da virgola nel primo file, da un singolo carattere che indica il tipo di modifica da apportare e da un numero di riga o da un intervallo di righe separate da virgola nel secondo file. Tutti i numeri di riga sono i numeri di riga originali in ciascun file. I tipi di comandi di modifica sono:

`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

4

Suggerisco di usare:

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

Quindi, quando leggi result.patch, capirai immediatamente la differenza.

Questi sono i significati delle opzioni della riga di comando:

-r : ricorsivo

-u : mostra il numero di riga

-p (piccolo): mostra le differenze nelle funzioni C.

-P (maiuscolo): in caso di più file viene mostrato il percorso completo


3

Le risposte sopra sono buone. Tuttavia, come un principiante, li ho trovati leggermente difficili da capire e dopo aver cercato ulteriormente, ho trovato un link molto utile: Comando Diff Linux ed esempi

Il sito spiega il concetto in modo semplice e di facile comprensione.

Il comando Diff è più facile da capire se lo consideri in questo modo:

In sostanza, genera una serie di istruzioni su come modificare un file per renderlo identico al secondo file.

Ognuno dei seguenti casi è spiegato bene:

a per aggiungere, c per modificare, d per eliminare


2

Rinomina le cose per aiutarti a ricordare!

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

I risultati operano sul file da modificare (file1), applicando vari aggiornamenti.


Somiglianza, trovo utili questi nomi per concettualizzare i risultati:

Elimina = "rimuovi" e Aggiungi = "inserisci".

2,4d1 --- D (s) - d -N --- d elete (' remove ') D line (s). Quindi sincronizzare alla riga N in entrambi.

4a2,4 --- N- a -U (s) --- Alla riga N, una o più righe di aggiornamento dd (' insert ') U

Nota: sono quasi simmetrici.


Modifica = 'rimuovi e inserisci'.

2,4c5,6 --- R (s) - c -U (s) --- Rimuovere le linee R (s), quindi inserire le linee U aggiornate al loro posto.



Per esempio:

4a2,4 --- a partire da 4, aggiungi le righe 2-4 aggiornate (ovvero 2,4 significa 2, 3 e 4)

2,4d1 --- rimuove le righe 2-4.

2,4c5,6 --- rimuovi le righe 2-4 e inserisci le righe aggiornate 5-6


  • So che si tratta di comandi dell'editor di flusso e progettati per essere elaborati da una macchina. Ad esempio, è davvero il comando ed aggiungi, non insert, ma è più utile per me pensare a insert che è ciò che alla fine viene fatto al file. Usano le operazioni di streaming, ma mi piace pensare in termini di risultati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.