Diff meldet Unterschiede, aber beide Zeilen sind gleich

55

Ich habe 2 Dateien unterschieden und bekam

1c1
< 1
---
> 1

Beide Dateien enthielten nur "1". Wie ist das anders?

Jiew Meng
quelle
poste
5
Wenn Sie diff verwenden, ist die -uOption möglicherweise besser lesbar.
Lekensteyn
@Rinzwind enthalten beide Dateien nur den Text 1, aber wenn Sie wollen mehr sehen , um zu sehen pastebin.com/byiqdie1
Jiew Meng
Es tut uns leid. Das tut es nicht, wenn ich das tue. Es muss etwas anderes geben. Mach ein cp 1 2(also überschreibe 2) und dann kannst du 100% sicher sein, dass sie gleich sind;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc

Antworten:

68

1. Zeile: asteht für hinzugefügt, dfür gelöscht und cfür geändert. Die Zeilennummern der Originaldatei werden vor diesen Buchstaben und die der geänderten Datei nach dem Buchstaben angezeigt.

2. Zeile: Zeile mit <stammt aus Datei 1 und unterscheidet sich von Datei 2.

3. Zeile ist ein Teiler.

4. Zeile: Zeile mit >stammt aus Datei 2 und unterscheidet sich von Datei 1.

(Wenn Sie jemals sehen =, bedeutet dies, dass die Zeilen in beiden Dateien gleich sind.)

Und Ihr Problem könnten Leerzeichen oder andere nicht vom Menschen lesbare Zeichen sein: Diese lösen ebenfalls einen Unterschied aus.

Es gibt einige Optionen zum Bearbeiten der Ausgabe.

Beispiel:

rinzwind @ discworld: ~ $ more 1 
Prüfung
test2
test3
rinzwind @ discworld: ~ $ more 2
Prüfung
test2  
test3

kontextbezogenes Format:

rinzwind @ discworld: ~ $ diff -c 1 2
1 2011-08-13 17: 05: 40.433966684 +0200
--- 2 13.08.2011 17: 11: 24.369966629 +0200
***************
*** 1,3 ****
  Prüfung
! test2
  test3
--- 1,3 ----
  Prüfung
! test2  
  test3

EIN "!" Stellt einen Wechsel zwischen Zeilen dar, die in den beiden Dateien übereinstimmen. Ein "+" steht für das Hinzufügen einer Zeile, ein Leerzeichen für eine unveränderte Zeile. Am Anfang des Patches stehen die Dateiinformationen, einschließlich des vollständigen Pfads und eines Zeitstempels. Am Anfang jedes Hunks stehen die Zeilennummern, die für die entsprechende Änderung in den Dateien gelten. Ein Zahlenbereich zwischen drei Sternchen gilt für die Originaldatei, während für die neue Datei drei Striche gelten. Die Blockbereiche geben die Anfangs- und Endzeilennummern in der jeweiligen Datei an.

Erweiterung von Lekensteyns Kommentar zum einheitlichen Format:

rinzwind @ discworld: ~ $ diff -u 1 2
--- 1 2011-08-13 17: 05: 40.433966684 +0200
+++ 2 13.08.2011 17: 11: 24.369966629 +0200
@@ -1,3 +1,3 @@
 Prüfung
-test2
+ test2  
 test3

Das Format beginnt mit demselben zweizeiligen Header wie das Kontextformat, außer dass der Originaldatei "---" und der neuen Datei "+++" vorangestellt ist. Darauf folgen ein oder mehrere Change Hunks, die die Zeilenunterschiede in der Datei enthalten. Vor den unveränderten Kontextzeilen steht ein Leerzeichen, vor den Additionszeilen ein Pluszeichen und vor den Löschzeilen ein Minuszeichen.

Einige nützliche Optionen:

-b Ignorieren Sie Änderungen an der Größe des Leerraums.

-w Ignoriere alle Leerzeichen.

-B Ignoriere alle Leerzeilen.

-y Ausgabe in 2 Spalten.

Rinzwind
quelle
Wie überprüfe ich, ob versteckte Zeichen vorhanden sind? Gibt es überhaupt versteckte Zeichen zu ignorieren (vielleicht nur Zeilenumbrüche und Tabulatoren ausschließen?) Ich nehme an, die meisten versteckten Zeichen sind zufällig?
Jiew Meng
Ich habe einige nützliche Optionen man diff
eingefügt
Mir ist aufgefallen, dass die Verwendung des Flags -b funktioniert. Hmm, ich sehe
keinen
@JiewMeng Führen Sie od -x1zbeide Dateien aus und vergleichen Sie die odAusgabe. Es sollte alle versteckten Unterschiede zwischen den Dateien finden.
Lgarzo
6

Ich halte od (octal dump) für nützlich, wenn ich Dateien mit nicht druckbaren Zeichen vergleiche (insbesondere Dateien, bei denen diff als "binär" eingestuft wird und die Ihnen nur mitteilen, dass sie sich unterscheiden).

Im folgenden Beispiel erstelle ich ein Dateipaar, das den ursprünglichen Dateien ähneln könnte, und führe dann einen Vergleich mit der ursprünglichen Ausgabe durch. Als nächstes differiere ich über ein paar verschiedene "od" Ausgänge.

$ echo 1> 1
$ echo "1"> 2
$ diff 1 2

1c1  
< 1  
- ---  
> 1   

$ od -c 1> 1.od
$ od -c 2> 2.od
$ diff 1.od 2.od

1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003

$ od -Ax -c -t x1 1> 1.od
$ od -Ax -c -t x1 2> 2.od
$ diff 1.od 2.od

1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003
Charles Boling
quelle
1

Ich hatte das gleiche Problem und fand eine Lösung, die helfen könnte, verwenden Sie den Befehl:

dos2unix <file1> <file2>

Eine davon kann im DOS / Windows-Format und die andere im UNIX-Format vorliegen

nachdem ich das getan habe, war das diff alles gut!

levk
quelle
0

Ich bin mir nicht sicher, ob dies bei schwer zu findenden Whitespace-Zeichen hilft, aber es ist praktisch zum Vergleichen: http://www.gnu.org/software/wdiff/

David Winiecki
quelle