[LINUX] Genaues Verhalten von diff --ignore-Matching-Lines = RE

Einführung

Der Befehl diff hat die Option --ignore-Matching-Lines = RE. Wenn man den Mann ansieht, heißt es "Änderungen ignorieren, bei denen alle Zeilen mit RE übereinstimmen" und es scheint zu ignorieren, wenn die Unterschiede mit dem regulären Ausdruck übereinstimmen. In Japanische Übersetzung heißt es außerdem: "Ignorieren Sie Änderungen, die nur Zeilen einfügen oder löschen, die mit REGEXP übereinstimmen. ".

Ich denke, das sind ziemlich irreführende Ausdrücke. (Ich weiß nicht, was ich meine, wenn ich es noch einmal lese, nachdem ich es verstanden habe ...) Dieser Abschnitt beschreibt das genaue Verhalten dieser Option.

Konkretes Beispiel

Betrachten Sie den Unterschied zwischen den folgenden beiden Dateien.

file1.txt


Date: 2020/4/7
Time: 20:00:00

file2.txt


Date: 2020/4/6
Time: 21:00:00

Wenn Sie "diff" normal nehmen

$ diff file1.txt file2.txt
1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Es wird sein. Angenommen, Sie möchten den Unterschied im Datum ignorieren und den Unterschied nur in der Zeit berücksichtigen.

$ diff -I Date file1.txt file2.txt
1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Das Ergebnis ist jedoch nicht anders. Versuchen Sie nun, eine leere Zeile zwischen Datum und Uhrzeit in file1.txt und file2.txt einzufügen.

file1.txt


Date: 2020/4/7

Time: 20:00:00

file2.txt


Date: 2020/4/6

Time: 21:00:00

Ebenso, wenn Sie "diff" nehmen

$ diff -I Date file1.txt file2.txt
3c3
< Time: 20:00:00
---
> Time: 21:00:00

Ich konnte nur die Zeit korrekt abrufen.

Dies liegt daran, dass --ignore-Matching-Lines mit Hunk und nicht mit Lines übereinstimmt. Ein Stück ist im ersten Beispiel ein Stück Unterschied

1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Ist ein Stück. Wenn Sie "diff" normalerweise mit einer Leerzeile nehmen, die als Test eingefügt wurde

$ diff file1.txt file2.txt
1c1
< Date: 2020/4/7
---
> Date: 2020/4/6
3c3
< Time: 20:00:00
---
> Time: 21:00:00

Und zwei Kerle. Das korrekte Verhalten von "--ignore-Matching-Lines" besteht darin, jedem dieser Hunks eine Übereinstimmung mit regulären Ausdrücken zuzuweisen und den ersten Hunk zu ignorieren.

Im Dokument

Die GNU-Dokumentation beschreibt das genaue Verhalten einschließlich dieses.

However, -I only ignores the insertion or deletion of lines that contain the regular expression if every changed line in the hunk—every insertion and every deletion—matches the regular expression. In other words, for each nonignorable change, diff prints the complete set of changes in its vicinity, including the ignorable ones.

Wie hier "jede geänderte Zeile im Hunk" steht, wird es nicht ignoriert, es sei denn, alle Hunk-Zeilen stimmen mit dem regulären Ausdruck überein. Wenn Sie so weit verstehen, werden Sie verstehen, dass sich die Bedeutung von "alles", das im Menschen geschrieben ist, und das Wort "nur" in der japanischen Übersetzung auf alle Kerle beziehen, aber es ist ziemlich schwierig, es auf den ersten Blick zu bemerken. nicht wahr….

Recommended Posts

Genaues Verhalten von diff --ignore-Matching-Lines = RE
Verhalten von multiprocessing.pool.Pool.map
[Python] Verhalten von Argmax
Verhalten von Matplotlib: Histgramm normiert
Verhalten der Pandas Rolling () Methode