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

Иногда картинка или пример стоят 1000 слов. Я сформировал следующий конвейер для «сравнения» двух дампов MySQL (структуры) на основе wnoiseответа выше (пожалуйста, дайте любые голоса за 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, у меня осталось всего два отличия: дата и т. д.

Без grepфильтра вывод выглядит так:

5127: ) ДВИЖОК=InnoDB AUTO_INCREMENT=340 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5105: ) ДВИЖОК=InnoDB AUTO_INCREMENT=271 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 5150: ) ДВИЖОК=InnoDB AUTO_INCREMENT=895 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5128: ) ДВИЖОК=InnoDB AUTO_INCREMENT=763 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 5170: ) ДВИЖОК=InnoDB AUTO_INCREMENT=1371 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | 5148: ) ДВИЖОК=InnoDB AUTO_INCREMENT=1173 НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Обратите внимание, что номера строк не совпадают. Я сначала meldпроверял, что все выстраивается в линию.

Связанный контент