diff - Zeilennummern ausgeben

25

Ich möchte das cli-Tool für den Dateivergleich verwenden und benötige die Zeilennummer vor der Ausgabezeile, mit der ich zur Zeilendifferenz springen kann, da ich ein Tool verwende, das weiß, wohin gesprungen werden muss, wenn die Zeile so beginnt :line-number: regular line contents

Also habe ich es versucht diffund das Lesen der Dokumentation scheint 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)

Es gibt jedoch kein Beispiel oder keine Erklärung für diesen komplizierten Schalter.

Ist es möglich, eine solche Ausgabe zu erhalten diff? Wenn das so ist, wie?

Zetah
quelle

Antworten:

45

Ja, es ist möglich. Bei Verwendung dieser Optionen wird standardmäßig nur jede Zeile gedruckt. Dies ist sehr ausführlich und nicht das, was Sie wollen.

diff --unchanged-line-format=""

werden unveränderte Linien eliminiert, so dass jetzt nur die alten und neuen Linien erzeugt werden.

diff --unchanged-line-format="" --new-line-format=":%dn: %L"

Jetzt werden die neuen Zeilen mit dem Präfix :<linenumber>:und einem Leerzeichen angezeigt, die alten Zeilen werden jedoch weiterhin gedruckt. Angenommen, Sie wollen sie beseitigen,

diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L"

Wenn Sie möchten, dass die alten und nicht die neuen Zeilen gedruckt werden, tauschen Sie sie aus.

wnoise
quelle
Einfach toll! Danke :) Ich habe versucht, anhand der Hilfeauflistung zu erraten, aber ohne Erfolg, und dachte, ich habe sie falsch gelesen. Dann habe ich mit Python ( difflibModul mit indizierten Dateien pro Zeile im Listenobjekt) nur das gemacht, was ich mit Python nicht verwenden konnte diff <(pipe buffer1) <(pipe buffer2), wie ich es geplant hatte diff. Jetzt hast du mich gerettet :)
Zetah
Es funktioniert nicht, wenn Sie * verwenden und Verzeichnisse vorhanden sind.
Herman Toothrot