Я пытаюсь понять команду linux diff для двух файлов, строки которых просто перестановки друг друга, но не в состоянии получить вывод, который он генерирует. Рассмотрим три команды ниже:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Может кто-нибудь объяснить вышеупомянутый загадочный вывод из diff.
- Почему в выводе вообще нет упоминания об «апельсинах»?
- Что
1d0
и2a2
означает?
Из этого ответа я понимаю, что:
«<» означает, что строка отсутствует в file2, а «>» означает, что строка отсутствует в file1
НО это не объясняет, почему апельсины отсутствуют в выводе.
oranges
это самая большая общая часть между двумя файлами, то, что вы получите, является кратчайшим способом выразить разницу между этими двумя файлами.diff -u file1 file2
вместо этого. Это называется «унифицированный формат». Первоначальный формат diff должен был быть очень компактным, но унифицированные diff должны быть более удобочитаемыми.diff -y file1 file2
Ответы:
Чтобы понять отчет, помните, что он
diff
носит предписывающий характер и описывает, какие изменения необходимо внести в первый файл (file1
), чтобы сделать его таким же, как и второй файл (file2
).В частности,
d
в1d0
означает удалить, аa
в2a2
означает добавить .Таким образом:
1d0
означает, что строка 1 должна быть удалена вfile1
(apples
).0
в1d0
строке означает, что они были бы во втором файле (file2
), если бы они не были удалены. Это означает, что при переходеfile2
кfile1
(назад) добавляется строка 1file1
после строки 0 offile2
.2a2
средство добавления второй линии (oranges
) отfile2
к ныне второй линииfile1
(после удаления первой строки вfile1
,oranges
перешли на линию 1)источник
0
внутри1d0
?Рассмотрим эти файлы:
file1
:file2
:Как
diff
работает, учитывая это на основе заказа:diff
читает первый блок строкfile1
иfile2
и пытается найти равные строки:Теперь он пропустит все строки, которые равны в обоих файлах, что как раз
oranges
в этом случае:Теперь найдите другой набор похожих строк и распечатайте различия:
Пропустить подобные строки
Найдите одинаковые строки, если это возможно, и выведите различия:
Теперь, если я сделаю
diff file1 file2
:Теперь просто объяснить, что
diff
означает вывод:Сделать
file1
равнымfile2
:1,2d0
: Удалить (d
) линии1-2
отfile1
и изменить линию0
изfile2
соответственно3a2
: Append (a
) к линии3
отfile1
линии2
изfile2
4a4,5
: Append к линии4
изfile1
линий4-5
отfile2
diff
сравниваетfile1
сfile2
построчно и устанавливает различия во временной памяти. После того ,file1
равнымfile2
до первого вхождения строки вfile1
, который также происходит вfile2
, все линии, которые равны до тех пор , пока разница не упоминаются, часто обозначается как---
. В этом случае есть только одна похожая строка, которая естьoranges
. Обратите внимание, что я сказалfile1
равноfile2
, поэтомуfile1
рассматривается относительно,file2
а не наоборот.Выходные данные относятся к первому данному файлу, в данном случае
file1
.источник
apples
встречается в обоих файлах также.oranges
". Неправильно: на самом деле есть две линии, которые не только похожи , но абсолютно идентичны . Один из них читаетoranges
, другой читаетapples
. Кроме того, ваше объяснение (чисто на основе порядка) противоречит комментарию Стефана к вопросу (основанному на длине) - кто прав?Там они:
источник
Стандартный (старый) формат вывода будет отображать разницу между файлами без окружающего текста с областями, где файлы различаются.
Например:
1d0 <
(удалить) означает, что яблоки необходимо удалить из 1-й строкиfile1
, а2a2 >
(добавить) означает, что яблоки необходимо добавить воfile2
2-ю строку, чтобы можно было сопоставить оба файла.Документация, доступная в,
info diff
объясняет это далее больше:Смотрите также:
Таким образом, чтобы увидеть апельсины, вы должны разложить их рядом или использовать единый контекст.
В примере:
источник