Розуміння різного виходу


87

Я маю 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 @@означає?

Відповіді:


96

У вашому першому 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нам показаний один фрагмент тексту замість двох окремих текстів. У рядку @@ -1,5 +1,5 @@частина -1,5стосується file1.txt, а частина +1,5- file2.txt. Вони кажуть нам, що diffпокаже фрагмент тексту, який триває 5 рядків, починаючи з рядка № 1 у file1.txt. І те саме про file2.txt - diffпоказує нам 5 рядків, починаючи з першого рядка.

Як я вже говорив, рядки з обох файлів відображаються разом

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

Тут -позначаються рядки, які були видалені з file1.txt, і +позначаються рядки, які були додані.


25

Підсумок :

Зазначено a 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), застосовуючи до нього різні оновлення.


Подібним чином я вважаю ці перейменування корисними для концептуалізації результатів:

Видалити = 'видалити' та Додати = 'вставити'.

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

4a2,4 --- N- -U (и) --- В рядку N, в дд ( ' вставки ') лінії (и) Оновлення в U

Примітка. Вони майже симетричні.


Change = 'видалити та вставити'.

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.