Wie kann ich 2 Dateien unterscheiden, während ich den führenden Leerraum ignoriere?

79

Ich habe 2 Quelldateien, sie sind verschiedene Versionen derselben Sache. Man hat jedoch einen anderen Editor durchlaufen, der Einrückungsänderungen vorgenommen hat, sodass alle Zeilen in diff unterschiedlich angezeigt werden.

Gibt es einen Diff-Befehl oder einen Filter, mit dem ich Diff verwenden kann, sodass die Ausgabe nur Zeilen enthält, die nach dem Ignorieren der führenden Leerzeichen / Tabulatoren unterschiedlich sind?

Ching Liu
quelle

Antworten:

110

diff hat einige Optionen, die für Sie nützlich sein können:

   -E, --ignore-tab-expansion
          ignore changes due to tab expansion

   -Z, --ignore-trailing-space
          ignore white space at line end

   -b, --ignore-space-change
          ignore changes in the amount of white space

   -w, --ignore-all-space
          ignore all white space

   -B, --ignore-blank-lines
          ignore changes whose lines are all blank

Also diff -w old newsollten alle Leerzeichen ignoriert werden und somit nur wesentlich unterschiedliche Zeilen gemeldet werden.

Lev Levitsky
quelle
13
Es ist erwähnenswert, dass -walle Leerzeichen vor dem Vergleich effektiv aus den Zeilen entfernt werden abund a bdaher als identisch gelten. Ich ziehe -bda es Leerzeichen ignoriert Änderungen , was bedeutet , dass abund a bsind unterschiedlich betrachtet aber a bund a+ mehr Leerzeichen + b(sorry, Mini-Markdown erlauben würde , nicht mehr Leerzeichen in Code!) Sind die gleich betrachtet.
IpsRich
Wie kann ich alle Zeilenumbrüche ignorieren?
StackOverflowOfficial
3
Kann ich sagen diff, dass äquivalente Reihenerweiterungen für transzendentale Zahlen wie e und pi ignoriert werden sollen?
Genorama
@ RichardWiseman Guter Punkt; In Fällen, in denen es Unterschiede zwischen Registerkarten und Leerzeichen gibt, gibt es keine gute Kombination, die außer funktioniert -w. -tb, -tbB, -tUsw. alle Leck in einigen Unterschieden , dass Sie es vorziehen , zu ignorieren. -wnicht, auch wenn dadurch möglicherweise auch einige Unterschiede ausgeschlossen werden, die Sie lieber sehen möchten.
TurnipEntropy
1

Wenn man Tabs falsch verwendet, kann man das beheben

expand bad_file
Steven Penny
quelle
0
diff -bB file[12]
-b, --ignore-space-change
      ignore changes in the amount of white space
-B, --ignore-blank-lines
      ignore changes whose lines are all blank

Bitte beachten Sie, dass bei dieser -wOption alle Leerzeichen vor dem Unterschied ignoriert werden, sodass eine Zeile wie this i s a lineund this is a linein jeder Datei als thisisalineUnterschiede verglichen wird und keine Unterschiede meldet.

Neben dem -wOptionsproblem weist auch die -bOption kleinere Probleme auf, die Leerzeichen nicht ignorieren, wenn sie am Anfang einer Zeile stehen

Sie sollten also sedzuerst die beim Start aufgetretenen Leerzeichen entfernen und dann `diff -bB ausführen.

diff -bB <(sed 's/^[ \t]*//' file1) <(sed 's/^[ \t]*//' file2)
αғsнιη
quelle
0

Mein Open-Source-Linux-Tool 'dif' vergleicht Dateien und ignoriert dabei verschiedene Unterschiede, einschließlich Leerzeichen.

Es gibt viele andere Optionen zum Ignorieren von Kommentaren oder Zeitstempeln, Sortieren der Eingabedateien, Suchen / Ersetzen, Ignorieren bestimmter Zeilen usw.

Nach der Vorverarbeitung der Eingabedateien werden die Linux-Tools meld, gvimdiff, tkdiff oder kompare für diese Zwischendateien ausgeführt.

Eine Installation ist nicht erforderlich. Laden Sie einfach die ausführbare Datei 'dif' von https://github.com/koknat/dif herunter und führen Sie sie aus

Verwenden Sie die Option -white, um Leerzeichen auf ein einzelnes Leerzeichen zu komprimieren:

dif file1 file2 -white

Verwenden Sie die Option -nowhite, um alle Leerzeichen (außer Zeilenumbrüchen) zu entfernen:

dif file1 file2 -nowhite
Chris Koknat
quelle