diff - Zeilennummern ausgeben

diff - Zeilennummern ausgeben

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 diffund 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 wnoiseobigen 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 diffOption „do:“ --side-by-sidebei 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 grepFilter 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 meldzuerst überprüft, ob alles in einer Reihe steht.

verwandte Informationen