Просмотр
различий между тремя файлами (GNU)
Синтаксис:
diff3
[опции...]
файл1 файл2 файл3
Поддерживаемые платформы:
Neutrino
Опции:
-a
Обработать
все файлы как текст и сравнить их построчно, даже если они не
являются текстовыми.
-A
Добавить
все различия между файл2 и файл3 в файл1, заключив все конфликты
в скобки. См. раздел "Выделение конфликтов".
-e
Создать
сценарий ed для добавления всех различий между файл2 и файл3 в
файл1. См. раздел "Выбор добавляемых изменений". (ed не входит
в комплект поставки QNX.)
-E
Аналогично
-e, но вывести необъединенные изменения, скобки перекрываются.
См. раздел "Выделение конфликтов".
-i
Создать
команды w и q в конце сценария ed для совместимости с System
V. Эта опция должна использоваться с одной из опций -AeExX3 и
не может использоваться с -m. См. раздел "Сохранение
измененного файла". (ed не входит в комплект поставки QNX.)
-L
метка
Использовать
метку метка для вывода скобок при использовании опций -A, - E
и -X. Эту опцию можно использовать до трех раз, по одному для
каждого входного файла. Метки по умолчанию – имена входных
файлов. Таким образом, действие diff3 -L X -L Y -L Z -m A B C
аналогично действию diff3 -m A B C, однако результат выглядит
таким образом, как будто команда выполнялась в отношении
файлов с именами X, Y и Z, а не A, B и C. См. раздел
"Выделение конфликтов".
-m
Применить
сценарий обработки к первому файлу и отправить результат в
стандартный поток вывода. В отличие от конвейерного вывода от
diff3 до ed, эту опцию можно использовать даже в отношении
двоичных файлов и неполных строк. -A используется, если не
указана опция сценария обработки. См. раздел "Непосредственное
создание объединенного вывода".
-T
Вывести
знак табуляции, а не два пробела перед текстом строки в
стандартном формате. В результате выравнивание знаков
табуляции в строке выглядит стандартно.
-v
Вывести
номер версии diff3.
-x
Аналогично
-e, но выводятся только перекрывающиеся изменения. См. раздел
"Выбор добавляемых изменений".
-X
Аналогично
-E, но выводятся только перекрывающиеся изменения. Другими
словами, аналогично - x, но изменения заключаются в скобки,
как в -E. См. раздел "Выделение конфликтов".
-3
Аналогично
-e, но выводятся только не перекрывающиеся изменения. См. раздел
"Выбор добавляемых изменений".
файл1
файл2
файл3
Это
пути к сравниваемым файлам. Вместо одного из этих имен файлов
можно использовать тире (-), при этом diff3 выполняет чтение
стандартного потока ввода для этого файла.
Описание:
Утилита
diff3 используется для сравнения трех файлов и отображения
различий между ними. (Также diff3 может объединять файлы. См.
раздел "Объединение по общему исходному файлу").
При
стандартном формате вывода diff3 каждый фрагмент различий
отображается без окружающего контекста. Фрагменты имеют метки
о том, являются ли они двусторонними или трехсторонними,
строки аннотируются в зависимости от их местоположения во
входных файлах.
Примеры
входных файлов
Далее
представлены образцы трех файлов, которые будут использоваться
в различных примерах, иллюстрирующих вывод diff3 и его
изменения при применении различных опций.
Пример
файла №1 – lao
Файл lao:
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 outcome.
The
two are the same,
But
after they are produced,
they have different names.
Пример
файла №2 – tzu
Файл tzu:
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 outcome.
The
two are the same,
But
after they are produced,
they
have different names.
They
both may be called deep and profound.
Deeper
and
more profound,
The
door of all subtleties!
Пример
файла №3 – tao
Третий
пример файла, с именем 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
Подробное
описание стандартного формата diff3
Каждый
фрагмент начинается со строки, помеченной "====".
Трехсторонние фрагменты содержат только строки с "====", в
двусторонних фрагментах добавлены "1", "2" или "3" для
обозначения, какие из трех входных файлов различаются в этом
фрагменте. Во фрагментах содержатся копии двух или трех
фрагментов строк ввода, каждой из которых предшествует одна
или две команды, указывающие на источник строк.
Как
правило, перед каждой копией строки ввода подставляются два
пробела, чтобы отличить их от команд. Однако с помощью опции
-T в diff3 используется знак табуляции вместо двух пробелов
для корректного выравнивания отступов.
Команды
имеют следующие формы:
файл:la
Этот
фрагмент отображается после строки l файла файл и не содержит
строк этого файла. Для изменения этого файла с целью получения
результата при сравнении с другими файлами следует добавить
строки фрагмента, полученные из других файлов. Например,
"1:11a" означает, что фрагмент содержит строки после строки 11
первого файла и не содержит строк из этого файла.
файл:rc
Этот
фрагмент содержит строки в диапазоне r из файла файл. Диапазон
r является парой номеров строк, разделенной запятой, или
только одним номером, если диапазон – одноэлементный. Для
изменения этого файла с целью получения результата при
сравнении с другими файлами следует заменить указанные строки
строками, полученными из других файлов. Например, "2:11,13c"
означает, что фрагмент содержит строки с 11 по 13 из второго
файла.
Если
последняя строка в наборе строк ввода не является полной, то
следующая за ней строка начинается с "\", что отличает ее от
полной строки.
Фрагменты diff3
Группы
строк, которые отличаются в двух или трех файлах ввода,
называются фрагменты diff3, по аналогии с фрагментами diff.
Если во фрагменте diff3 различаются все три входных файла, то
фрагмент называется трехсторонним фрагментом; если различаются
только два входных файла, то это – двусторонний фрагмент.
Как
и для diff, возможны несколько решений. При сравнении файлов
A, B и C diff3 обычно находит фрагменты diff3 путем
объединения вывода двусторонних фрагментов с помощью двух
команд diff A B и diff A C. При этом не обязательно
уменьшается размер вывода, но исключения возникают редко.
Например,
предположим, что файл 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", общая
для всех трех файлов, и трехсторонний фрагмент, содержащий
последнюю строку каждого файла.
Пример
стандартного формата 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
Объединение
по общему исходному файлу
Если
изменения внесены в копии одного файла, то результатом работы
diff3 может быть объединенный вывод, содержащий оба набора
изменений и предупреждения о конфликтах.
Можно
было бы представить себе программы с именами diff4 или diff5
для одновременного сравнения более трех файлов, но на практике
такая необходимость возникает редко. diff3 можно использовать
для объединения более трех наборов изменений в файле путем
объединения двух наборов изменений единовременно.
Утилита
diff3 может внедрить изменения двух измененных версий в общую
предыдущую версию. Это позволяет объединять наборы изменений,
представленных двумя более новыми файлами. Укажите версию
общего исходного файла в качестве второго аргумента и две
более новых версии в качестве первого и третьего аргументов
следующим образом:
*
diff3 файл1 файл2 файл3
Порядок
аргументов можно запомнить по цифрам.
Процесс
можно представить как вычитание файл2 из файл3 и добавление
результата к файл1 или объединение в файле файл1 изменений,
которые превратят файл2 в файл3. Это объединение является
четко определенным, если контекст каждого изменения в файл1 и
файл2 совпадает. Если различаются все три входных файла или
только файл3, то возникает другая ситуация, которая называется
конфликт. Если различаются все три входных файла, то конфликт
называется перекрытие.
С помощью утилиты diff3 обработка перекрытий и
конфликтов может осуществляться несколькими способами.
Перекрытия или конфликты можно пропустить, или выбрать только
перекрытия, или пометить конфликты специальными строками
"<<<<<<<" и
">>>>>>>".
Утилита
diff3 может вывести результаты объединения в сценарии ed,
который можно применить к первому файлу для получения
объединенного вывода. Однако, как правило, лучше использовать
diff3 для непосредственного создания объединенного вывода; при
этом можно избежать некоторых проблем с ed. Обратите внимание,
что ed не входит в комплект поставки QNX.
Выбор
добавляемых изменений
Можно
выбрать все необъединенные изменения между файл2 и файл3 и
объединить с файл1 с помощью опции -e. Можно выбрать только не
перекрывающиеся необъединенные изменения с помощью - 3, либо
выбрать только перекрывающиеся изменения с помощью -x.
Опции
-e, -3 и -x используются для выбора только необъединенных
изменений, т.е. таких изменений, при которых различаются файл1
и файл3; при этом игнорируются изменения между файл2 и файл3,
если файл1 и файл3 идентичны, т.к. предполагается, что эти
изменения уже объединены. Если такое предположение не надежно,
то можно использовать опцию -A. (См. раздел "Выделение
конфликтов").
Далее
приведен результат работы команды diff3 с каждой из этих опций
(полное содержимое файлов см. в разделе "Образцы входных
файлов"). Обратите внимание, что результатом использования -e
является объединение разрозненных наборов изменений, выданных
при использовании ключей -3 и -x.
Вывод
diff3 -e lao tzu tao:
11a
-- The
Way of Lao-Tzu, tr. Wing-tsit Chan
.
8c
so
we may see their result.
.
Вывод
diff3 -3 lao tzu tao:
8c
so
we may see their result.
.
Вывод
diff3 -x lao tzu tao:
11a
-- The
Way of Lao-Tzu, tr. Wing-tsit Chan
.
Выделение конфликтов
Утилита
diff3 может пометить конфликты в объединенном выводе, выделив
их специальными строками-маркерами. Конфликт между двумя
файлами, A и B выделяется следующим образом:
<<<<<<<
A
строки
из A
=======
строки
из B
>>>>>>>
B
Конфликт,
полученный из трех файлов A, B и C выделяется следующим образом:
<<<<<<<
A
строки
из A
||||||| B
строки
из B
=======
строки
из C
>>>>>>>
C
Действие
опции -A аналогично действию опции -e, но конфликты
заключаются в скобки и выводятся все изменения между файл2 и
файл3, а не только необъединенные изменения. Таким образом, в
результате работы diff3 -A lao tzu tao с образцами входных
файлов (см. раздел "Образцы входных файлов") конфликты будут
выделены скобками только там, где отличается tzu:
11a
||||||| tzu
They
both may be called deep and profound.
Deeper
and more profound,
The
door of all subtleties!
=======
-- The
Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>>
tao
.
11a
<<<<<<<
lao
.
8c
so
we may see their result.
.
2a
>>>>>>>
tao
.
0a
<<<<<<<
tzu
=======
.
При
использовании опции -E будет выведено меньше данных, чем при
использовании опции - A, т.к. выводятся только необъединенные
изменения, а содержимое второго файла не выводится. Таким
образом, действие опции -E аналогично действию опции -e,
однако в результате первый и третий файлы из тройных
перекрывающихся изменений заключаются в скобки. Так же,
действие -X аналогично -x, однако в результате скобками
выделяются все (обязательно перекрывающиеся) изменения.
Например, в отношении вышеприведенных тройных перекрывающихся
изменений применение опций -E и -X приведет к следующим
результатам:
11a
||||||| tzu
They
both may be called deep and profound.
Deeper
and more profound,
The
door of all subtleties!
=======
-- The
Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>>
tao
.
11a
<<<<<<<
lao
.
8c
so
we may see their result.
.
2a
>>>>>>>
tao
.
0a
<<<<<<<
tzu
=======
.
Если
имена сравниваемых файлов бессмысленны или не информативны,
можно использовать опцию -L метка или --label=метка для
отображения альтернативных имен в скобках
"<<<<<<<", "|||||||" и
">>>>>>>". Эту опцию можно использовать
до трех раз, по одному для каждого входного файла. Таким
образом, действие diff3 -A -L X -L Y -L Z A B C аналогично
действию diff3 -A A B C, однако результат выглядит таким
образом, как будто команда выполнялась в отношении файлов с
именами X, Y и Z, а не A, B и C.
Непосредственное
создание объединенного вывода
При
использовании опции -m в результате работы diff3 будет выведен
непосредственно объединенный файл. Использование этого ключа
для создания такого файла более эффективно, чем ed, кроме того
этот ключ работает даже с нетекстовыми файлами, которые были
бы отклонены ed. При указании -m без опции сценария ed
предполагается использование -A (--show-all). (Обратите
внимание, что ed не входит в комплект поставки QNX.)
Например,
результатом работы команды diff3 -m lao tzu tao (содержимое
файлов см. в разделе "Образцы входных файлов") будет
следующее:
<<<<<<<
tzu
=======
The
Way that can be told of is not the eternal Way;
The
name that can be named is not the eternal name.
>>>>>>>
tao
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.
<<<<<<<
lao
|||||||
tzu
They
both may be called deep and profound.
Deeper
and
more profound,
The
door of all subtleties!
=======
-- The
Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>>
tao
Объединение
неполных строк в diff3
При
использовании -m неполные строки просто копируются в вывод по
мере обнаружения; если объединенный вывод завершается
конфликтом и один из входных файлов завершается неполной
строкой, то закрывающие скобки "|||||||", "=======" или
">>>>>>>" отображаются не в начале
строки, т.к. они добавляются к неполной строке.
При
отсутствии -m, если указана опция сценария ed и обнаружена
неполная строка, в результате работы diff3 создается
предупреждение и команда действует, как при наличии новой
строки.
Сохранение
измененного файла
Традиционная
для Unix команда diff3 создает сценарий ed без завершающих
команд w и q, которые сохраняют изменения. diff3 системы
System V создает эти дополнительные команды. diff3 GNU обычно
действует, как традиционная команда diff3 Unix, но при
использовании опции -i действует как команда diff3 System V и
добавляет команды w and q.
Опция
-i не совместима с опцией объединенного вывода -m, и для нее
необходима одна из опций -AeExX3 опции сценария ed.
Статус завершения:
0
Команда
diff3 выполнена успешно.
1
Обнаружены
некоторые конфликты.
>1
Возникла ошибка.
Автор:
GNU