Diff en "--GTYPE-group-format"

Ik heb twee bestanden die ik wil vergelijken met diff . Gewijzigde regels moeten een voorvoegsel "U" krijgen, nieuwe regels "I" en verwijderde "D":

file1:

1
2
3
4
5

file2:

1
2a
4
5
6

diff --old-group-format="D %<" \
--new-group-format="I %>" \
--changed-group-format="U %>" \
--unchanged-group-format="" file1 file2

De uitvoer is:

U 2a
I 6

Maar waar is het

D 3

?

3
Als een antwoord uw probleem oplost, accepteert u dit door op het grote vinkje (✓) ernaast te klikken. Als u andere antwoorden nuttig vindt, stem ze dan toe. Aanvaarde en gestemde antwoorden helpen niet alleen diegenen die hebben geantwoord, maar ook toekomstige lezers. Zie het relevante artikel in het Helpcentrum . Als je vraag nog niet volledig is beantwoord, geef dan feedback.
toegevoegd de auteur mklement0, de bron

2 antwoord

Het is een soort van manier waarop diff dingen groepeert. In uw groep gewijzigd drukt u de nieuwe wijziging af en niet de oude, wat zou zijn

U 2
3

Dus de groeperingen die diff zien is:

`1 -> 1` unchanged
`2,3 -> 2a` changed
`4,5 -> 4,5` unchanged
`  -> 6` new

Om diff een groep als 'oud' te laten groeperen, moet er voor en na een verandering plaatsvinden. Dus als file2 zo was:

1a
2
4
5
6

En je hebt hetzelfde diff-commando uitgevoerd, je zou dit krijgen:

U 1a
D 3
I 6

Because there is a 2 -> 2 and 4 -> 4 that is unchanged so the missing 3 gets grouped as "old".

7
toegevoegd
Oké, er moet voor en na een verandering zijn maar ik heb geen controle over de bestelling. Is er een andere manier om het resultaat te krijgen?
toegevoegd de auteur Toru, de bron

Als aanvulling op het nuttige antwoord van Jon Lin :

While you can't use the ---group-format options directly to always show deleted lines (as explained in Jon's answer), the --side-by-side (-y) output-format option does contain the desired information, and you can use awk to reformat it as desired:

diff --suppress-common-lines --side-by-side file1 file2 | 
 awk -F'\t+' '$2 ~/+\|/ { print "U " $3 }
              $2 ~/+</{ print "D " $1 }
              $2 ~/+>/  { print "I " $3 }'

Met uw voorbeeldbestanden levert dit op:

U 2a
D 3
I 6

welke de bovenstaande awk -opdracht produceerde van de volgende - zij-aan-zij -uitvoer:

2                                 | 2a
3                                 <
                                  > 6
0
toegevoegd