diff zeigt nur Unterschiede innerhalb der Linie

9

Ich möchte Zeilen in zwei Dateien vergleichen, aber um das Rauschen in der Ausgabe zu minimieren, möchte ich, dass nur die tatsächlichen Unterschiede in den Zeilen gedruckt werden.

Zum Beispiel angesichts der beiden folgenden Dateien:

a.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z

b.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z

(Der Unterschied zwischen ihnen ist der Fall des Briefes b)

Ich möchte, dass die Ausgabe ungefähr so ​​aussieht:

[-b-]{+B+}

Derzeit war der beste Ansatz, den ich gefunden habe, die Verwendung git diff --word-diff, aber er gibt die gesamte Zeile aus:

a [-b-]{+B+} c d e f g h i j k l m n o p q r s t u v w x y z

Gibt es eine direktere Möglichkeit, als die Ausgabe manuell zu analysieren? Idealerweise würde ich auch etwas verwenden, das allgemeiner verfügbar ist als git diffz. B. ein POSIX-Shell-Tool, bei dem der Benutzer keine zusätzlichen Pakete installieren muss.

anol
quelle
Es wäre schön, wenn Sie ein Beispiel verwenden würden, bei dem die Unterschiede sichtbarer wären. Ich musste schielen, um zu sehen, dass diese beiden Charaktere nicht gleich sind.
Barmar
Entschuldigung, ich habe eine Notiz hinzugefügt, die den Unterschied zwischen den Zeilen beschreibt.
Anol
Warum nicht einfach verwenden bund Bso ist es offensichtlich? Ich verstehe, dass dies wahrscheinlich der eigentliche Unterschied war, aber für die Zwecke der Frage können Sie es einfacher machen.
Barmar
1
Ich wollte Lösungen vermeiden, die nur mit ASCII-Zeichen funktionieren, aber da die vorgeschlagene Lösung nicht davon abhängt, habe ich sie geändert. Ich kann die Antwort jedoch nicht aktualisieren, um die neuen Änderungen widerzuspiegeln, da die Bearbeitung kleiner als 6 Zeichen sein würde.
Anol
Verwandte: unix.stackexchange.com/questions/11128/diff-within-a-line
Ciro Santilli 法轮功 病毒 审查 六四 六四 法轮功

Antworten:

14

Mit wdiff :

$ wdiff -3 a.txt b.txt

======================================================================
 [-b-] {+B+}
======================================================================

Die Option -3oder ---no-commonentfernt Wörter, die zwischen den beiden Dateien gemeinsam sind, und zeigt nur die Unterschiede an.

Das ===...Banner (und leere Zeilen) können entfernt werden mit grep:

$ wdiff -3 a.txt b.txt | grep -vx '=*'
 [-b-] {+B+}

wdiffSie können auch einheitliche diffDaten lesen , wenn Sie die Option -doder --diff-inputangeben, z. B. von git:

git diff somefile | wdiff -d -3

Obwohl wdiffes sich nicht um ein POSIX-Tool handelt, ist es allgemein verfügbar.

Kusalananda
quelle
Es kann erwähnenswert sein, dass Sie, wenn Ihr Terminal ANSI-Escapezeichen unterstützt, die Ausgabe von WDIFF-Druckfarben in (baso) einfacher lesen können, wenn Sie dies in Ihrem Bashrc lesen: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(von hier aus ).
scohe001