diff3

Просмотр различий между тремя файлами (GNU)

Синтаксис:

diff3 [опции...] файл1 файл2 файл3

Опции:

-a
Обработать все файлы как текст и сравнить их построчно, даже если они не являются текстовыми.
-A
Добавить все различия между файл2 и файл3 в файл1, заключив все конфликты в скобки. См. раздел "Выделение конфликтов".
-e
Создать сценарий ed для добавления всех различий между файл2 и файл3 в файл1. См. раздел "Выбор добавляемых изменений".
-E
Аналогично -e, но вывести необъединенные изменения, скобки перекрываются. См. раздел "Выделение конфликтов".
-i
Создать команды w и q в конце сценария ed для совместимости с System V. Эта опция должна использоваться с одной из опций -AeExX3 и не может использоваться с -m. См. раздел "Сохранение измененного файла".
-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 выполняет чтение стандартного потока ввода для этого файла.

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

aarch64, arm, armv7, e2k, mips, ppc, x86

Описание:

Утилита diff3 используется для сравнения трех файлов и отображения различий между ними. (Также diff3 может объединять файлы. См. раздел "Объединение по общему исходному файлу").

При стандартном формате вывода diff3 каждый фрагмент различий отображается без окружающего контекста. Фрагменты имеют метки о том, являются ли они двусторонними или трехсторонними, строки аннотируются в зависимости от их местоположения во входных файлах.

Примеры входных файлов

Далее представлены образцы трех файлов, которые будут использоваться в различных примерах, иллюстрирующих вывод diff3 и его изменения при применении различных опций.

Пример №1 – файл 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

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

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 может внедрить изменения двух измененных версий в общую предыдущую версию. Это позволяет объединять наборы изменений, представленных двумя более новыми файлами. Укажите версию общего исходного файла в качестве второго аргумента и две более новых версии в качестве первого и третьего аргументов следующим образом:

Порядок аргументов можно запомнить по цифрам.

Процесс можно представить как вычитание файл2 из файл3 и добавление результата к файл1 или объединение в файле файл1 изменений, которые превратят файл2 в файл3. Это объединение является четко определенным, если контекст каждого изменения в файл1 и файл2 совпадает. Если различаются все три входных файла или только файл3, то возникает другая ситуация, которая называется конфликт. Если различаются все три входных файла, то конфликт называется перекрытие.

С помощью утилиты diff3 обработка перекрытий и конфликтов может осуществляться несколькими способами. Перекрытия или конфликты можно пропустить, или выбрать только перекрытия, или пометить конфликты специальными строками "<<<<<<<" и ">>>>>>>".

Утилита diff3 может вывести результаты объединения в сценарии ed, который можно применить к первому файлу для получения объединенного вывода. Однако, как правило, лучше использовать diff3 для непосредственного создания объединенного вывода; при этом можно избежать некоторых проблем с ed.

Выбор добавляемых изменений

Можно выбрать все необъединенные изменения между файл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. . Output of diff3 -3 lao tzu tao: 8c so we may see their result. . Output of diff3 -x lao tzu tao: 11a -- The Way of Lao-Tzu, tr. Wing-tsit Chan .

Выделение конфликтов

Утилита diff3 может пометить конфликты в объединенном выводе, выделив их специальными строками-маркерами. Конфликт между двумя файлами, A и B выделяется следующим образом:

<<<<<<< A lines from A ======= lines from B >>>>>>> B

Конфликт, полученный из трех файлов A, B и C выделяется следующим образом:

<<<<<<< A lines from A ||||||| B lines from B ======= lines from 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).

Например, результатом работы команды 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
Возникла ошибка.

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино»

В ЗОСРВ «Нейтрино» редакции 2020 утилита обновлена до версии 3.7 (diffutils)

Тематические ссылки:

cmp, diff, patch




Предыдущий раздел: Утилиты