Просмотр различий между тремя файлами (GNU)
diff3 [опции...] файл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 используется знак табуляции вместо двух пробелов для корректного выравнивания отступов.
Команды имеют следующие формы:
Если последняя строка в наборе строк ввода не является полной, то следующая за ней строка начинается с "\", что отличает ее от полной строки.
Фрагменты 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.
Базовые подсистемы ЗОСРВ «Нейтрино»
ЗОСРВ
«Нейтрино»
редакции 2020
утилита обновлена до версии 3.7 (diffutils)
Предыдущий раздел: Утилиты