Понимание различий вывода


89

у меня есть file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

а также file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

если я делаю: diff file1.txt file2.txtя получаю:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Как выходные данные обычно интерпретируются? Я думаю, что это <означает, что удалены, но что делать 3d2или 5a5значить?

Если я сделаю:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Результаты более ясны, но что это @@ -1,5 +1,5 @@значит?

Ответы:


98

В вашем первом diffвыводе (так называемый "normall diff") значение выглядит следующим образом

< - обозначает строки в file1.txt

> - обозначает строки в file2.txt

3d2и 5a5обозначить затронутые номера строк и какие действия были выполнены. dобозначает удаление, aобозначает добавление (и cобозначает изменение). число слева от символа - это номер строки в file1.txt, число справа - это номер строки в file2.txt. Так 3d2говорит вам, что 3-я строка в file1.txt была удалена и имеет строку номер 2 в file2.txt (или лучше сказать, что после удаления счетчик строк вернулся к строке 2). 5a5говорит вам, что мы начали со строки 5 в файле file1.txt (который фактически был пустым после того, как мы удалили строку в предыдущем действии), добавили строку, и эта добавленная строка является номером 5 в файле file2.txt.

Вывод diff -uкоманды отформатирован немного по-другому (так называемый формат «унифицированный diff»). Здесь diffпоказан нам один фрагмент текста, а не два отдельных текста. В строке @@ -1,5 +1,5 @@часть -1,5относится к file1.txt, а часть +1,5к file2.txt. Они говорят нам, что diffпокажет фрагмент текста длиной 5 строк, начиная со строки № 1 в file1.txt. И то же самое с file2.txt - diffпоказывает нам 5 строк, начиная со строки 1.

Как я уже сказал, строки из обоих файлов показаны вместе

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Здесь -обозначены строки, которые были удалены из file1.txt, и +обозначены строки, которые были добавлены.


25

Резюме :

Задано diff file1 file2, <означает, что строка отсутствует в file2и >означает, что строка отсутствует в file1. 3d2И 5a5могут быть проигнорированы, они являются командами для patchкоторый часто используется с diff.

Полный ответ :

Многие утилиты * nix предлагают руководства TeXinfo, а также более простые manстраницы. вы можете получить к ним доступ info command, например, запустив info diff. В этом случае интересующий вас раздел:

2.4.2 Подробное описание нормального формата


Обычный формат вывода состоит из одного или нескольких блоков различий; каждый блок показывает одну область, где файлы отличаются. Обычные фрагменты формата выглядят так:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

Существует три типа команд изменения. Каждый из них состоит из номера строки или диапазона строк, разделенных запятыми, в первом файле, одного символа, указывающего тип вносимого изменения, и номера строки или диапазона строк, разделенных запятыми, во втором файле. Все номера строк являются исходными номерами строк в каждом файле. Типы команд изменения:

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been

4

Я предлагаю использовать:

diff -rupP file1.txt file2.txt > result.patch

Тогда, когда вы будете читать result.patch, вы сразу узнаете разницу.

Это значения параметров командной строки:

-r : рекурсивный

-u : показывает номер строки

-p (маленький): показывает различия в функциях C

-P (заглавная): в случае нескольких файлов отображается полный путь


3

Приведенные выше ответы хорошие. Однако, как новичок, я обнаружил, что их немного трудно понять, и после дальнейшего поиска я нашел очень полезную ссылку: Linux Diff Command & examples

Сайт объясняет концепцию в простой и понятной форме.

Команду Diff легче понять, если рассмотреть ее так:

По сути, он выводит набор инструкций о том, как изменить один файл, чтобы сделать его идентичным второму файлу.

Каждый из следующих случаев хорошо объяснен:

a для добавления, c для изменения, d для удаления


2

Переименуйте вещи, которые помогут вам вспомнить!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

Результаты работают с файлом для редактирования (file1), применяя к нему различные обновления.


Сходство, я нахожу эти переименования полезными для концептуализации результатов:

Delete = 'удалить' & Add = 'insert'.

2,4d1 --- D (s) - d -N --- d elete (' удалить ') D строка (и). Затем синхронизируйте в строке N в обоих.

4a2,4 --- N- -U (ы) --- В строке N, в дд ( ' вставки ') линии (ы) Обновление по U

Примечание: они почти симметричны.


Изменить = «удалить и вставить».

2,4c5,6 --- R (s) - c -U (s) --- Удалить строки R (s), затем вставить обновленные строки U (s) на их место.



Например:

4a2,4 --- начиная с 4, добавить обновленные строки 2-4 (т.е. 2,4 означает 2, 3 и 4)

2,4d1 --- удалить строки 2-4.

2,4c5,6 --- удалите строки 2-4 и вставьте обновленные строки 5-6


  • Я знаю, что это команды потокового редактора, предназначенные для обработки машиной. Например, это действительно команда ed , а не вставка, но для меня более полезно подумать о вставке, которая, в конце концов, и делается с файлом. Они используют потоковые операции, но мне нравится думать о результатах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.