diff - números de línea de salida

diff - números de línea de salida

Quiero usar la herramienta cli para comparar archivos y necesito el número de línea antes de la línea de salida, con lo que puedo saltar a la diferencia de línea, porque uso una herramienta que entiende dónde saltar, si la línea comienza así.:line-number: regular line contents

Así que lo intenté diffy parece que leer la documentación podría ser posible:

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

pero no hay ningún ejemplo o explicación sobre este complicado cambio.

¿Es posible obtener ese resultado diff? ¿Si es así, cómo?

Respuesta1

Sí, es posible. Cuando se utilizan estas opciones, el valor predeterminado es simplemente imprimir cada línea. Esto es muy detallado y no es lo que quieres.

diff --unchanged-line-format=""

eliminará las líneas que no han cambiado, por lo que ahora solo se producen las líneas antiguas y nuevas.

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

Ahora mostrará las nuevas líneas con el prefijo :<linenumber>:y un espacio, pero seguirá imprimiendo las líneas antiguas. Suponiendo que quieras eliminarlos,

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

Si desea que se impriman las líneas antiguas en lugar de las nuevas, cámbielas.

Respuesta2

A veces una imagen o un ejemplo vale más que 1000 palabras. Formé el siguiente canal para "comparar" dos volcados de MySQL (estructura) según la wnoiserespuesta anterior (por favor, dé su voto a favor wnoise).

Ejemplos de números de línea uno al lado del otro:

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

Lamentablemente descubrí que la diffopción hacer: --side-by-sideno es compatible con las opciones de formato de línea.

Eliminar las líneas AUTO_INCREMENT me dejó solo dos diferencias: la fecha, etc.

Sin el grepfiltro, la salida se ve así:

5127: ) MOTOR = InnoDB AUTO_INCREMENT = 340 JUEGO DE CARACTERES PREDETERMINADO = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; | 5105: ) MOTOR=InnoDB AUTO_INCREMENT=271 JUEGO DE CARACTERES PREDETERMINADO=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 5150: ) MOTOR = InnoDB AUTO_INCREMENT = 895 JUEGO DE CARACTERES PREDETERMINADO = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; | 5128: ) MOTOR = InnoDB AUTO_INCREMENT = 763 JUEGO DE CARACTERES PREDETERMINADO = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; 5170: ) MOTOR = InnoDB AUTO_INCREMENT = 1371 JUEGO DE CARACTERES PREDETERMINADO = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; | 5148: ) MOTOR=InnoDB AUTO_INCREMENT=1173 JUEGO DE CARACTERES PREDETERMINADO=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Observe que los números de línea no coinciden. Solía meld​​​​verificar que las cosas estuvieran alineadas primero.

información relacionada