diff - 行番号を出力する

diff - 行番号を出力する

ファイル比較に CLI ツールを使用したいのですが、出力行の前に行番号が必要です。行が次のように始まる場合、どこにジャンプするかを理解するツールを使用しているため、行の違いにジャンプするのに役立ちます。:line-number: regular line contents

そこで試してみたところdiff、ドキュメントを読むと可能かもしれないことがわかりました。

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

しかし、この複雑なスイッチに関する例や説明はありません。

からそのような出力を取得することは可能ですかdiff? 可能であれば、どのようにすればよいですか?

答え1

はい、可能です。これらのオプションを使用する場合、デフォルトではすべての行が印刷されます。これは非常に冗長であり、望ましい結果ではありません。

diff --unchanged-line-format=""

変更されていない行は削除され、古い行と新しい行のみが生成されます。

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

:<linenumber>:とスペースが先頭に付いた新しい行が表示されますが、古い行も表示されます。古い行を削除したい場合は、

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

新しい行ではなく古い行を印刷したい場合は、それらを入れ替えます。

答え2

時には、画像や例が 1,000 語の価値があることもあります。私は、wnoise上記の回答に基づいて 2 つの MySQL (構造) ダンプを「比較」するために、次のパイプラインを作成しました (賛成票を にお願いしますwnoise)。

横並びの行番号の例:

 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="

diff残念ながら、 do: オプションは--side-by-side行形式オプションではサポートされていないことがわかりました。

AUTO_INCREMENT 行を削除すると、日付などの 2 つの違いだけが残りました。

フィルターがない場合、grep出力は次のようになります。

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;

行番号が一致していないことに注意してください。meld最初に、すべてが揃っていることを確認していました。

関連情報