Ich habe zwei Dateien, die beim Vergleich mit diff anzeigen, dass sich jede Zeile geändert hat. Wenn ich sie mit diff -w
(Whitespace ignorierend) vergleiche, werden die wenigen minimalen Änderungen angezeigt, die ich erwarte.
Offensichtlich gibt es einen Unterschied zwischen den Leerzeichen in jeder Datei, aber ich weiß nicht, was sie sind oder wie sie zu finden sind. Ich habe versucht, die Dateien zu bearbeiten, um sicherzustellen, dass das Leerzeichen tatsächlich Leerzeichen sind (im Gegensatz zu Tabulatoren), bin mir aber nicht sicher, was ich sonst tun soll.
Ich habe vim mit verwendet :set list on
, um zu bestätigen, dass am Ende der Zeilen kein Leerzeichen steht.
Ich glaube auch, dass jede Datei Linux-Zeilenterminatoren hat, da vim die ^M
am Ende der Zeilen nicht angezeigt hat .
quelle
diff
aber viele Editoren machen diesen Platz standardmäßig nicht sichtbar.vim
Benutzer sind, haben Sie dann versucht,vimdiff file1 file2
die Unterschiede zu ermitteln?Antworten:
Für
vim
Benutzer gibt es ein praktisches Hilfsprogramm, um die genauen Unterschiede zwischen Dateien anzuzeigen:Dadurch wird jede Datei in Fenstern nebeneinander und mit farblich hervorgehobenen Unterschieden abgelegt.
Einige nützliche Befehle in
vimdiff
Während in
vimdiff
, sind einige nützliche Befehle:]c
: zur nächsten Änderung springen[c
: zur vorherigen Änderung springenctrl-W ctrl-W
: zu anderem Fenster wechselnzo
: offene Faltenzc
: enge FaltenBeispiel
Hier ist ein Beispiel für
vimdiff
in einemxterm
Vergleich von zwei Versionen einercups
Konfigurationsdatei:Sie können sehen, dass lange Abschnitte identischer Zeilen reduziert wurden. Sie können mit wieder geöffnet werden
zo
.Das Farbschema hängt von Ihren Optionseinstellungen ab. Wenn im obigen Beispiel eine Zeile in einer Datei angezeigt wird, die andere jedoch nicht, erhält diese Zeile einen dunkelblauen Hintergrund. In der anderen Datei werden die fehlenden Linien durch gestrichelte Linien angezeigt. Wenn in beiden Dateien eine Linie mit einigen Unterschieden angezeigt wird, haben die unveränderten Teile der Linien einen rosa Hintergrund und die geänderten Teile einen roten Hintergrund.
quelle
Auf FreeBSD- oder den meisten Linux-Systemen können Sie die Ausgabe von diff weiterleiten
cat -v -e -t
, um Leerraumunterschiede anzuzeigen.Tabs wird gezeigt werden , wie
^I
eine$
am Ende jeder Zeile angezeigt werden , so dass Sie nachfolgende Leerzeichen sehen, und nicht druckbare Zeichen werden als angezeigt^X
oderM-X
.Wenn Sie GNU-Coreutils haben (verfügbar auf den meisten nicht ausgelasteten Linux-Distributionen), kann dies vereinfacht werden
Verwenden Sie auf Busybox-Systemen
catv -vet
.quelle
Wurde eine der Dateien auf einem Windows-Computer bearbeitet?
Die Standard-Leitungsbeendigung unter Windows ist CRLF, unter Linux ist es einfach LF (und auf Macs war es früher CR, aber ich vermute, das hat sich seit OS X geändert).
Probieren Sie
wc -l
die Dateien aus und prüfen Sie, wie viele Zeilen vorhanden sind. Prüfen Sie dann, ob der Größenunterschied mit der Anzahl der Zeilen übereinstimmt (die letzte Zeile darf nicht in einer Datei abgeschlossen sein).quelle
od
kann helfen. Der Befehl Octal Dump kann Inhalte hexadezimal anzeigen. Auf diese Weise können Sie feststellen, welche Bytes, einschließlich Nullbytes oder unerwarteter Leerzeichen, in einer Datei enthalten sind. Mögliche häufige Ursachen sind LF gegen CRLF, Tabulatoren gegen Leerzeichen oder ASCII gegen Unicode (die häufig nur ein Null-Byte vor jedem normalerweise sichtbaren Byte haben).od -x filename
sollte eines dieser Muster offenbaren. Wenn Sie die Datei genauer betrachten möchten, ist ein "Hex-Editor" möglicherweise hilfreich. Das Schöne daranod
ist, dass es wie dercut
Befehl in viele Unix-Systeme eingebaut ist. Daher ist häufig keine separate Installation erforderlich.Wenn Sie Dateien benötigen, die ähnlicher sind,
tr
können Sie einige Änderungensed
vornehmen und weitere. Ich würde wahrscheinlich damit beginnenls -l
zu sehen, welche Datei größer ist, dann Bytes anzeigen, um zu sehen, was geändert werden muss, und dann eine der Dateien so ändern, dass sie ähnlicher erscheinen.quelle
Um herauszufinden, wo sich echte Leerzeichen und Tabulatoren befinden, können Sie diese ersetzen, indem Sie
sed
beispielsweise Folgendes eingeben :Und jetzt vergleichen Sie die beiden Dateien.
quelle
cat
, wie in superuser.com/a/913368/37154Der folgende Inhalt wurde hier aus dem Abschnitt "Frage" oben kopiert, der von Romski geschrieben wurde.
Beides
vimdiff
unddiff file1 file2 | cat -A
waren aus Sicht der Werkzeuge sehr nützlich.Zuletzt habe ich ein weiteres Problem gefunden. Einige meiner Dateien wurden mit UTF-8 BOM codiert. Dies wurde mit hervorgehoben
diff file1 file2 | cat -A
. Dies zeigte sichM-oM-;M-?
am Anfang der betroffenen Datei:Obwohl es eine Reihe von Problemen gab, habe ich im Folgenden einige Befehle für diejenigen aufgeführt, die ihre Dateien bereinigen müssen:
quelle