Ich möchte ein CLI-Tool zum Vergleichen von Dateien verwenden und brauche eine Zeilennummer vor der Ausgabezeile, mit deren Hilfe ich zur Zeilendifferenz springen kann, da ich ein Tool verwende, das versteht, wohin gesprungen werden muss, wenn die Zeile so beginnt:line-number: regular line contents
Ich habe es also versucht diff
und beim Lesen der Dokumentation scheint es möglich zu sein:
-D, --ifdef=NAME output merged file with `#ifdef NAME' diffs
--GTYPE-group-format=GFMT format GTYPE input groups with GFMT
--line-format=LFMT format all input lines with LFMT
--LTYPE-line-format=LFMT format LTYPE input lines with LFMT
These format options provide fine-grained control over the output
of diff, generalizing -D/--ifdef.
LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'.
GFMT (only) may contain:
%< lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F first line number
L last line number
N number of lines = L-F+1
E F-1
M L+1
%(A=B?T:E) if A equals B then T else E
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number
Both GFMT and LFMT may contain:
%% %
%c'C' the single character C
%c'\OOO' the character with octal code OOO
C the character C (other characters represent themselves)
aber es gibt kein Beispiel oder Erklärung zu diesem komplizierten Wechsel.
Ist es möglich, eine solche Ausgabe zu erhalten diff
? Und wenn ja, wie?
Antwort1
Ja, das ist möglich. Wenn Sie diese Optionen verwenden, wird standardmäßig einfach jede Zeile ausgedruckt. Das ist sehr ausführlich und nicht das, was Sie wollen.
diff --unchanged-line-format=""
werden unveränderte Zeilen eliminiert, so dass jetzt nur noch die alten und neuen Zeilen erstellt werden.
diff --unchanged-line-format="" --new-line-format=":%dn: %L"
zeigt nun die neuen Zeilen mit :<linenumber>:
einem Leerzeichen an, druckt aber weiterhin die alten Zeilen aus. Angenommen, Sie möchten diese löschen,
diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L"
Wenn Sie möchten, dass statt der neuen Zeilen die alten ausgedruckt werden, vertauschen Sie diese.
Antwort2
Manchmal sagt ein Bild oder Beispiel mehr als tausend Worte. Ich habe die folgende Pipeline gebildet, um zwei MySQL-(Struktur-)Dumps basierend auf der wnoise
obigen Antwort zu „vergleichen“ (bitte geben Sie Ihre Upvotes an wnoise
).
Beispiele für nebeneinander angeordnete Zeilennummern:
diff --unchanged-line-format="" --old-line-format="%dn: %L " --new-line-format="| %dn: %L" \
./20220202-msqldump.sql ./20221130-msqldump.sql |
awk -e' /^[[:digit:]]+: )/{ previous = $0; next; } { print previous $0 }' |
grep -v -e"ENGINE=InnoDB AUTO_INCREMENT="
Leider habe ich festgestellt, dass die diff
Option „do:“ --side-by-side
bei den Zeilenformatoptionen nicht unterstützt wird.
Durch das Eliminieren der AUTO_INCREMENT-Zeilen blieben für mich nur zwei Unterschiede, nämlich das Datum und so weiter.
Ohne den grep
Filter sieht die Ausgabe wie folgt aus:
5127: ) ENGINE=InnoDB AUTO_INCREMENT=340 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5105: ) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 5150: ) ENGINE=InnoDB AUTO_INCREMENT=895 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5128: ) ENGINE=InnoDB AUTO_INCREMENT=763 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 5170: ) ENGINE=InnoDB AUTO_INCREMENT=1371 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5148: ) ENGINE=InnoDB AUTO_INCREMENT=1173 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Beachten Sie, dass die Zeilennummern nicht übereinstimmen. Früher habe ich meld
zuerst überprüft, ob alles in einer Reihe steht.