Wie kann ich diff so einstellen, dass nur hinzugefügte und gelöschte Zeilen angezeigt werden? Wenn diff es nicht kann, welches Tool kann es?
command-line-interface
diff
Kreuz
quelle
quelle
diff A B | grep '^[<>]'
comm
.Antworten:
Versuchen Sie es mit comm
Eine andere Sichtweise:
Zeilen anzeigen, die nur in Datei a existieren: (dh was aus a gelöscht wurde)
Zeige Zeilen, die nur in Datei b existieren: (dh was wurde zu b hinzugefügt)
Zeige Zeilen, die nur in der einen oder der anderen Datei existieren: (aber nicht in beiden)
(Warnung: Wenn eine Datei
a
Zeilen enthält, die mit TAB beginnen, wird sie (die erste TAB) aus der Ausgabe entfernt.)Nur sortierte Dateien
HINWEIS: Beide Dateien müssen sortiert sein, damit
comm
sie ordnungsgemäß funktionieren. Wenn sie noch nicht sortiert sind, sollten Sie sie sortieren:Wenn die Dateien extrem lang sind, kann dies eine ziemliche Belastung sein, da eine zusätzliche Kopie und damit doppelt so viel Speicherplatz erforderlich ist.
quelle
comm -12 <(sort a) <(sort b)
comm
könnte machen was du willst. Von seiner Manpage:Diese Spalten sind unterdrückbar mit
-1
,-2
und-3
jeweils.Beispiel:
Und wenn Sie nur die eindeutigen Zeilen möchten und es Ihnen egal ist, in welcher Datei sie sich befinden:
Wie in der Manpage steht, müssen die Dateien vorher sortiert werden.
quelle
Anzeigen von Hinzufügungen und Löschungen ohne Kontext, Zeilennummern, +, -, <,>! usw. können Sie diff wie folgt verwenden:
Zum Beispiel zwei Dateien gegeben:
a.txt
b.txt
Der folgende Befehl zeigt Zeilen an, die entweder aus a entfernt oder zu b hinzugefügt wurden:
Ausgabe:
Dieser etwas andere Befehl zeigt Zeilen an, die aus a.txt entfernt wurden:
Ausgabe:
Schließlich zeigt dieser Befehl Zeilen an, die zu a.txt hinzugefügt wurden
Ausgabe
quelle
Das ist, was diff standardmäßig tut ... Vielleicht müssen Sie einige Flags hinzufügen, um Whitespace zu ignorieren?
sollten Leerzeilen und unterschiedlich viele Leerzeichen ignorieren.
quelle
Nein,
diff
zeigt die Unterschiede zwischen zwei Dateien nicht so, wie man denkt. Es erzeugt eine Folge von Bearbeitungsbefehlen für ein Werkzeugpatch
, mit dem Sie eine Datei in eine andere ändern möchten.Die Schwierigkeit für jeden Versuch, das zu tun, wonach Sie suchen, besteht darin, zu definieren, was eine geänderte Zeile gegenüber einer gelöschten Zeile und einer hinzugefügten Zeile darstellt. Außerdem, was zu tun ist, wenn Zeilen nebeneinander hinzugefügt, gelöscht und geändert werden.
quelle
diff
Quellen angesehen habe, aber ich scheine mich an alle möglichen Drehungen zu erinnern, um zu verfolgen, wo zwei Dateien übereinstimmen, um synchron zu bleiben, und ich denke, es gibt eine Schwelle zum Aufgeben, die davon abhängt, wie weit die voneinander entfernt sind Linien sind. Aber ich erinnere mich an keinen Zeilenabgleich, außer an (optional) reduzierte Leerzeichen oder ignorierte Groß- und Kleinschreibung. Oder (vielleicht) Worte zu diesem Thema. Auf jeden Fall geht es darum,patch
und "vgrep" kommt nur für die Fahrt mit. Vielleicht. Am Dienstag.Visuelle Vergleichstools passen zwei Dateien zusammen, sodass ein Segment mit der gleichen Anzahl von Zeilen, aber unterschiedlichem Inhalt als geändertes Segment betrachtet wird. Völlig neue Zeilen zwischen übereinstimmenden Segmenten werden als hinzugefügte Segmente betrachtet.
So funktioniert auch das Befehlszeilentool sdiff , mit dem zwei Dateien in einem Terminal nebeneinander verglichen werden. Geänderte Zeilen werden durch | getrennt Charakter. Wenn eine Zeile nur in Datei A vorhanden ist, wird <als Trennzeichen verwendet. Wenn eine Zeile nur in Datei B vorhanden ist, wird> als Trennzeichen verwendet. Wenn die Dateien keine <und> Zeichen enthalten, können Sie dies verwenden, um nur hinzugefügte Zeilen anzuzeigen:
quelle
Danke Senarvi, deine Lösung (nicht gewählt) hat mir GENAU das gegeben, was ich wollte, nachdem ich jahrelang auf einer Tonne Seiten gesucht hatte.
Nach Ihrer Antwort habe ich mir Folgendes ausgedacht, um die Liste der Dinge zu ändern / hinzuzufügen / zu löschen. Das Beispiel verwendet zwei Versionen der Datei / etc / passwd und druckt den Benutzernamen für die relevanten Datensätze aus.
quelle
Ich finde diese spezielle Form oft nützlich:
Beispiel:
Ausgabe:
Es werden also alte Zeilen mit
-
gefolgt von der entsprechenden neuen Zeile mit angezeigt+
.Wenn wir eine Löschung von
C
:es sieht aus wie das:
Das Format ist dokumentiert unter
man diff
:und:
und:
Zugehörige Frage: https://stackoverflow.com/questions/15384818/wie-den- Unterschied- nur- zwischen-zwei- Dateien-in-linux- additionieren
Getestet in Ubuntu 18.04.
quelle
Datei1:
Datei2:
Verwenden:
Hier werden zwei Spalten für Repectives-Dateien angezeigt.
Ausgabe:
quelle