diff - numéros de ligne de sortie

25

Je veux utiliser l'outil cli pour la comparaison de fichiers et j'ai besoin d'un numéro de ligne avant la ligne de sortie avec laquelle je pourrais passer à la différence de ligne, car j'utilise un outil qui sait où sauter, si la ligne commence comme ça :line-number: regular line contents

J'ai donc essayé diff, et la lecture de la documentation semble 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)

mais il n'y a aucun exemple ou explication sur ce commutateur compliqué.

Est-il possible d'obtenir une telle sortie diff? Si c'est le cas, comment?

zetah
la source

Réponses:

45

Oui c'est possible. Lorsque vous utilisez ces options, la valeur par défaut consiste simplement à imprimer chaque ligne. C'est très verbeux et pas ce que vous voulez.

diff --unchanged-line-format=""

éliminera les lignes inchangées, donc maintenant seules les anciennes et les nouvelles lignes sont produites.

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

affichera maintenant les nouvelles lignes préfixées par :<linenumber>:et un espace, mais imprimera toujours les anciennes lignes. En supposant que vous vouliez les éliminer,

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

Si vous souhaitez imprimer les anciennes lignes plutôt que les nouvelles, permutez-les.

wnoise
la source
Tout simplement génial! Merci :) J'ai essayé de deviner à partir de la liste d'aide, mais sans succès, et j'ai pensé l'avoir mal lu. Ensuite, j'ai fait ce que je voulais avec Python ( difflibmodule avec des fichiers indexés par ligne dans l'objet liste) uniquement que je ne pouvais pas utiliser diff <(pipe buffer1) <(pipe buffer2)avec Python, comme je l'avais prévu diff. Maintenant tu m'as sauvé :)
zetah
cela ne fonctionne pas si vous utilisez * et qu'il existe des répertoires.
Herman Toothrot