Diff – How to Output Line Numbers

diff()

I want to use cli tool for file comparison and need line-number before output line with which help I could jump to line difference, because I use tool which understands where to jump, if the line begins like this :line-number: regular line contents

So I tried diff, and reading documentation seems like it might be possible:

  -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)

but there is no example or explanation about this complicated switch.

Is it possible to get such output from diff? If so how?

Best Answer

Yes, it is possible. When using these options, the default is just to print out every line. This is very verbose, and not what you want.

diff --unchanged-line-format=""

will eliminate lines that are unchanged, so now only the old and new lines are produced.

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

will now show the new lines prefixed by :<linenumber>: and a space, but still print the old lines. Assuming you want to eliminate them,

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

If you want the old lines rather than the new ones to be printed, swap them around.

Related Question