Inverses Grep mit einer Musterdatei zeigt keine Nichtübereinstimmungen an

Inverses Grep mit einer Musterdatei zeigt keine Nichtübereinstimmungen an

Ich habe zwei nahezu identische Dateien,"foo" und "bar".

Jede Datei hat Tausende von Zeilen, jede Zeile hat eine Nummer.

Wenn ich sortund dann diffbeide Dateien einfüge, ist das das Ergebnis:

$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489

Wenn ich jedoch grep -Fvfbeide Dateien verwende, erhalte ich in beide Richtungen null „Nichtübereinstimmungen“:

$ grep -Fvf foo bar
$ grep -Fvf bar foo
$

Warum ist das so? Sollte ich nicht ähnliche Ergebnisse wie bei diff erhalten? Ich würde erwarten, dass der erste Befehl mir die „erste Hälfte“ der Werte von diff zurückgibt und der zweite grep-Befehl mir den Rest zurückgibt.

Warum erhalte ich nicht die erwarteten Ergebnisse?

Antwort1

Denn diffim Gegensatz grep -FvfzuDie Reihenfolge, in der die Zeilen erscheinen, ist wichtig. Da die -xOption nicht im grep-Befehl enthalten war, wurden Zeilen mit bloßenteilweise Übereinstimmungensind von der Ausgabe ausgeschlossen.

Reproduzierbares Beispiel

Betrachten Sie diese beiden Dateien:

$ cat foo
156
174
15676
17486
17487
$ cat bar
15677
15678
156
174
15676

Der diffBefehl zeigt, dass sie unterschiedlich sind, während die grepBefehle keine Ausgabe erzeugen:

$ diff foo bar
0a1,2
> 15677
> 15678
4,5d5
< 17486
< 17487
$ grep -Fvf foo bar; grep -Fvf bar foo

Wenn wir „full-line matches“ hinzufügen -x, erzeugt grep Folgendes:

$ grep -Fvxf foo bar
15677
15678
$ grep -Fvxf bar foo
17486
17487

Zusätzlicher Vorschlag

Alsablichtenin den Kommentaren vorschlägt, diff -uerzeugt mehr Kontext, der das Ergebnis verständlicher machen kann.

verwandte Informationen