Verständnis der Diff-Ausgabe

87

ich habe file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

und file2.txt

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

wenn ich tue: diff file1.txt file2.txtich bekomme:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Wie wird die Ausgabe allgemein interpretiert? Ich denke, das <heißt entfernt, aber was tun 3d2oder 5a5bedeuten?

Wenn ich mache:

$ 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  

Die Ergebnisse sind klarer, aber was bedeutet @@ -1,5 +1,5 @@das?

Jim
quelle

Antworten:

96

In Ihrer ersten diffAusgabe (so genanntes "normales Diff") lautet die Bedeutung wie folgt

< - kennzeichnet Zeilen in file1.txt

> - kennzeichnet Zeilen in file2.txt

3d2und 5a5bezeichnen betroffene Zeilennummern und welche Aktionen ausgeführt wurden. dsteht für Löschen, asteht für Hinzufügen (und csteht für Ändern). Die Zahl links vom Zeichen ist die Zeilennummer in Datei1.txt, die Zahl rechts die Zeilennummer in Datei2.txt. So 3d2erfahren Sie, dass die 3. Zeile in file1.txt gelöscht wurde und die Zeilennummer 2 in file2.txt hat (oder besser gesagt, dass der Zeilenzähler nach dem Löschen auf Zeilennummer 2 zurückging). 5a5teilt Ihnen mit, dass wir mit Zeile 5 in Datei1.txt begonnen haben (die tatsächlich leer war, nachdem wir in der vorherigen Aktion eine Zeile gelöscht haben), die Zeile hinzugefügt haben und diese hinzugefügte Zeile die Nummer 5 in Datei2.txt ist.

Die Ausgabe des diff -uBefehls ist etwas anders formatiert (sogenanntes "Unified Diff" -Format). Hier diffzeigt uns ein einzelnes Stück des Textes anstelle von zwei separaten Texten. In der Zeile bezieht sich @@ -1,5 +1,5 @@der Teil -1,5auf file1.txt und der Teil +1,5auf file2.txt. Sie teilen uns mit, dass diffein 5 Zeilen langer Text ab Zeile 1 in der Datei file1.txt angezeigt wird. Und das Gleiche gilt für die Datei2.txt - diffzeigt uns 5 Zeilen ab Zeile 1.

Wie ich bereits sagte, werden die Zeilen aus beiden Dateien zusammen angezeigt

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

Hier sind -die Zeilen angegeben, die aus file1.txt gelöscht wurden, und +die Zeilen, die hinzugefügt wurden.

John Smith
quelle
25

Zusammenfassung :

Ein gegebener diff file1 file2, <bedeutet , dass die Zeile fehlt in file2und >bedeutet , dass die Linie in fehlt file1. Die 3d2und 5a5können ignoriert werden, sie sind Befehle, für patchdie oft mit verwendet wird diff.

Vollständige Antwort :

Viele * nix-Dienstprogramme bieten TeXinfo-Handbücher sowie die einfacheren manSeiten an. Sie können auf diese zugreifen, indem Sie info commandbeispielsweise ausführen info diff. In diesem Fall ist der Bereich, der Sie interessiert,:

2.4.2 Detaillierte Beschreibung des Normalformats


Das normale Ausgabeformat besteht aus einem oder mehreren Unterschieden. Jeder Block zeigt einen Bereich, in dem sich die Dateien unterscheiden. Normalformat-Hunks sehen folgendermaßen aus:

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

Es gibt drei Arten von Änderungsbefehlen. Jede Zeile besteht aus einer Zeilennummer oder einem durch Kommas getrennten Zeilenbereich in der ersten Datei, einem einzelnen Zeichen, das die Art der durchzuführenden Änderung angibt, und einer Zeilennummer oder einem durch Kommas getrennten Zeilenbereich in der zweiten Datei. Alle Zeilennummern sind die ursprünglichen Zeilennummern in jeder Datei. Die Arten von Änderungsbefehlen sind:

`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
quelle
4

Ich schlage vor zu verwenden:

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

Wenn Sie dann lesen result.patch, werden Sie den Unterschied sofort erkennen.

Dies sind die Bedeutungen der Befehlszeilenoptionen:

-r : rekursiv

-u : Zeigt die Zeilennummer an

-p (klein): zeigt Unterschiede in C-Funktionen

-P (Großbuchstaben): Bei mehreren Dateien wird der vollständige Pfad angezeigt

Ravi
quelle
3

Die obigen Antworten sind gut. Als Anfänger war es jedoch etwas schwierig, sie zu verstehen, und als ich weiter suchte, fand ich einen sehr nützlichen Link: Linux Diff Command & Examples

Die Site erklärt das Konzept auf einfache und leicht verständliche Weise.

Der Diff-Befehl ist einfacher zu verstehen, wenn Sie ihn folgendermaßen betrachten:

Im Wesentlichen gibt es eine Reihe von Anweisungen zum Ändern einer Datei aus, damit sie mit der zweiten Datei identisch ist.

Jeder der folgenden Fälle wird gut erklärt:

a zum Hinzufügen, c zum Ändern, d zum Löschen

userAsh
quelle
2

Benenne die Dinge um, damit du dich erinnerst!

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

Die Ergebnisse wirken sich auf die zu bearbeitende Datei (Datei1) aus und führen verschiedene Aktualisierungen durch.


Ähnlichkeit, ich finde diese Umbenennungen hilfreich, um die Ergebnisse zu konzipieren:

Delete = 'remove' & Add = 'insert'.

2,4d1 --- D (s) - d -N --- d lösche (' entferne ') D Zeile (n). Synchronisieren Sie dann in beiden Zeilen mit Zeile N.

4a2,4 --- N- a -U (s) --- In Zeile N die Zeile (n) U eines dd (' Einfügen ') -Updates

Hinweis: Sie sind nahezu symmetrisch.


Ändern = 'Entfernen & Einfügen'.

2,4c5,6 --- R (s) - c -U (s) --- Entfernen Sie die Zeilen R (s) und fügen Sie dann aktualisierte Zeilen U (s) ein.



Zum Beispiel:

4a2,4 --- ab 4 aktualisierte Zeilen 2-4 hinzufügen (dh 2,4 bedeutet 2, 3 und 4)

2,4d1 --- Zeilen 2-4 entfernen.

2,4c5,6 --- entferne die Zeilen 2-4 und füge die aktualisierten Zeilen 5-6 ein


  • Ich weiß, dass dies Stream-Editor-Befehle sind, die von einem Computer verarbeitet werden sollen. Zum Beispiel ist es wirklich der ed- Befehl add, nicht insert, aber für mich ist es hilfreicher, an insert zu denken, was letztendlich an der Datei getan wird. Sie verwenden Stream-Operationen, aber ich denke gerne in Form von Ergebnissen.

Elliptische Ansicht
quelle