Diff и "--GTYPE-group-format" - PullRequest
       27

Diff и "--GTYPE-group-format"

3 голосов
/ 11 ноября 2011

У меня есть два файла, которые я хочу сравнить с diff.Измененные строки должны получить префикс «U», новые строки «I» и удаленные «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

Вывод:

U 2a
I 6

Но где

D 3

?

Ответы [ 2 ]

7 голосов
/ 11 ноября 2011

Это своего рода способ, которым diff группирует вещи.В вашей группе changed вы печатаете новое изменение, а не старое, которое будет

U 2
3

Таким образом, группировка, которую видит diff:

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

В порядкечтобы diff сгруппировал совпадение как «старое», должно быть неизменным до и после.Итак, если file2 был такой:

1a
2
4
5
6

И вы запустили ту же команду diff, вы получите это:

U 1a
D 3
I 6

Поскольку есть 2 -> 2 и 4 -> 4это не изменяется, поэтому недостающие 3 группируются как «старые».

0 голосов
/ 21 декабря 2015

В дополнение к полезный ответ Джона Линя :

Хотя вы не можете напрямую использовать опции --<gtype>-group-format, чтобы всегда показывать удаленные строки (как объяснено в Джонеответ), параметр --side-by-side (-y) формата вывода содержит необходимую информацию, и вы можете использовать awk для ее форматирования по своему усмотрению:

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

С вашими примерами файлов это приводит к:

U 2a
D 3
I 6

, который вышеприведенная команда awk сгенерировала из следующего вывода --side-by-side:

2                                 | 2a
3                                 <
                                  > 6
...