Библиотека сайта rus-linux.net
7. Сравнение трех файлов
С помощью программы 'diff3' можно сравнивать три файла и выяснять любые различия между ними. ('diff3' также может объединять файлы; см. "Объединение файлов с помощью 'diff3'").
"Нормальный" формат вывода 'diff3' показывает каждый ханк различий без окружающего контекста. Ханки помечаются метками, показывающими охватывает ли различие 2 или 3 файла и строкой, показывающей их расположение в входных файлах.
См. подробнее о работе 'diff3': "Запуск diff3".
7.1 Третий образец входного файла
Далее приведен третий образец файла, который будет использоваться в примерах, показывающих резльтаты работы 'diff3', и того, как различные опции могут их менять. Первые два файла - те же, что мы использовали для 'diff' (см. Два образца входных файлов::.). Это третий образец, под названием 'tao':
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
The named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
7.2 Детальное описание нормального формата 'diff3'
Каждый ханк начинается со строки отмеченной '===='. Ханки описывающие различие, охватывающее все три файла содержат просто строку '====', если же различие охватывает только два файла, к строке добавляют '1', '2' или '3', чтобы показать, какой из трех входных файлов имеет отличие в этом ханке. Ханки содержащие копии из двух или трех наборов из входных файлов, предваряются одной или двумя командами определяющими откуда эти строки появились.
Обычно, два пробела предваряют каждую копию выходной строки, чтобы отличить их от команд. Но с опцией '-T' или '--initial-tab', 'diff3' использует табуляцию вместо двух пробелов; такие строки таблуирются правильно. См. подробнее: "Табуляция".
Команды имеют следующие формы:
- 'FILE:La'
Этот ханк появляется после строки L файла FILE и не содержит строк в этом файле. Для изменения этого файла до другого файла, нужно добавить строки ханка взятые из других файлов. Например, '1:11a' означает, что ханк следует за строкой 11 в первом файле и не содержит строк из этого файла.
- 'FILE:Rc'
Этот ханк содержит строки из промежутка R файла FILE. Промежуток R - разделенная запятой пара номеров строк, или один номер, если промежуток состоит из одной строки. Для изменения этого файла до другого файла, нужно заменить указанные строки на строки взятые из другого файла. Например, '2:11,13c' означает, что ханк содержит строки с 11 по 13 из второго файла.
Если последняя строка в наборе входных строк неполна (см. Неполные строки::.), она будет выделена при выводе, следующей строкой, начинающейся с символа '\', чтобы отличаться от полной строки.
7.3 Ханки 'diff3'
Группы строк, различающихся в двух или трех входных файлах называются "diff3-ханки", по аналогии с ханками 'diff' (см. Ханки::.). Если все три входных файла различаются в 'diff3'-ханке, ханк называется "тринаправленным ханком"; если только два файла различаются, он называется "двунаправленным".
Как и при работе с 'diff', могут приниматься разные решения какие строки считать одинаковыми. При сравнивании файлов 'A', 'B' и 'C', 'diff3' обычно находит 'diff3'-ханки c помощью объединения двунаправленных ханков, полученных двумя командами 'diff A B' и 'diff A C'. Это необязательно минимизирует размер 'diff3' ханка, но исключения довольно редки.
Например, предположим 'F' содержит три строки 'a', 'b', 'f'; 'G' содержит строки 'g', 'b', 'g'; а 'H' содержит строки 'a', 'b', 'h'. Результаты работы 'diff3 F G H' будут следующими:
====2
1:1c
3:1c
a
2:1c
g
====
1:3c
f
2:3c
g
3:3c
h
потому что найден двунаправленный ханк, содержащий информацию о строке
'a', общей для первого и третьего файла, и строке 'g' из второго
файла; затем, одиночная строка 'b', общая для всех трех файлов; и,
наконец, тринаправленный ханк содержащий последнюю строку каждого
файла.
7.4 Пример нормального формата 'diff3'
Далее приведен результат работы команды 'diff3 lao tzu tao' (см. "Третий образец входного файла" для полного содержания файлов). Заметьте, что отображаются только строки, отличающие среди трех файлов.
====2
1:1,2c
3:1,2c
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
2:0a
====1
1:4c
The Named is the mother of all things.
2:2,3c
3:4,5c
The named is the mother of all things.
====3
1:8c
2:7c
so we may see their outcome.
3:9c
so we may see their result.
====
1:11a
2:11,13c
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
3:13,14c
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
Next Previous Contents