Різниця у звітах різниці, але обидва рядки однакові


55

Я розіграв 2 файли і отримав

1c1
< 1
---
> 1

Обидва файли містили просто "1". Чим це відрізняється?


розмістіть вміст обох файлів, будь ласка;)
Rinzwind

5
Якщо ви використовуєте diff, -uопція може бути читабельнішою для людей.
Лекенштейн

@Rinzwind, обидва файли містять лише текст 1, але якщо ви хочете побачити більше, подивіться pastebin.com/byiqdie1
Jiew Meng

Вибачте. Це не тоді, коли я це роблю. Має бути щось інше. Зробіть cp 1 2(так перепишіть 2), і тоді ви можете бути на 100% b впевнені, що вони однакові;)
Rinzwind

2
vimdiff file1 file2? : D
dylnmc

Відповіді:


68

1-й рядок: aозначає додані, dвидалені та cзмінені. Номери рядків у вихідному файлі з’являються перед цими літерами, а зміни в файлі - після цього листа.

2-й рядок: рядок з <є з файлу 1 і відрізняється від файлу 2.

3-й рядок - дільник.

4-й рядок: рядок з >є з файлу 2 і відрізняється від файлу 1.

(Якщо ви коли-небудь бачите =це означає, що рядки однакові в обох файлах)

І вашою проблемою можуть бути пробіли або інші читабельні символи, які не читаються людиною: вони також викликають різницю.

Існує кілька варіантів маніпулювання результатами.

Приклад:

rinzwind @ discworld: ~ $ більше 1 
тест
тест2
тест3
rinzwind @ discworld: ~ $ більше 2
тест
тест2  
тест3

контекстний формат:

rinzwind @ discworld: ~ $ diff -c 1 2
*** 1 2011-08-13 17: 05: 40.433966684 +0200
--- 2 2011-08-13 17: 11: 24.369966629 +0200
***************
*** 1,3 ****
  тест
! тест2
  тест3
--- 1,3 ----
  тест
! тест2  
  тест3

А "!" являє собою зміну між рядками, які відповідають двом файлам. "+" Являє собою додавання рядка, тоді як порожній пробіл являє собою незмінний рядок. На початку патча - інформація про файл, включаючи повний шлях та часову позначку. На початку кожного елемента - номери рядків, які застосовуються до відповідної зміни у файлах. Діапазон чисел між наборами з трьох зірочок застосовується до оригінального файлу, тоді як набори з трьох тире застосовуються до нового файлу. Діапазони запису задають номери початкового та кінцевого рядків у відповідному файлі.

Розширення на коментар Лекенштейна щодо уніфікованого формату:

rinzwind @ discworld: ~ $ diff -u 1 2
--- 1 2011-08-13 17: 05: 40.433966684 +0200
+++ 2 2011-08-13 17: 11: 24.369966629 +0200
@@ -1,3 +1,3 @@
 тест
-тест2
+ тест2  
 тест3

Формат починається з того самого дворядкового заголовка, що і контекстного формату, за винятком того, що вихідному файлу передує "---", а новому файлу передує "+++". Слідом за цим є один або кілька запитів змін, які містять різниці рядків у файлі. Зміненим, контекстним рядкам передує пробільний символ, рядкам додавання передує знак плюс, а рядкам видалення передує знак мінус.

Деякі корисні варіанти:

-b Ігноруйте зміни кількості білого простору.

-w Ігноруйте весь простір.

-B Ігноруйте всі порожні рядки.

-y вихід у 2 колон.


Як перевірити, чи є приховані символи? Чи варто ігнорувати приховані символи (можливо, лише виключаючи нові рядки та вкладки?) Я вважаю, що більшість прихованих символів є випадковими?
Jiew Meng

Я вклав кілька корисних варіантів (скопійований з man diff;))
Rinzwind

Я помічаю, що прапор -b працює. Хм, я не бачу різниці у
пробілі

@JiewMeng Запуск od -x1zобох файлів та порівняння odрезультатів. Він повинен знайти будь-які приховані відмінності між файлами.
lgarzo

6

Я вважаю, що od (восьмеричний дамп) є корисним при порівнянні файлів з недрукуваними символами (зокрема, файли, які відрізняються від думки, є "бінарними", і, таким чином, повідомляють лише, що вони відрізняються).

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

$ echo 1> 1
$ echo "1"> 2
$ diff 1 2

1c1  
< 1  
- ---  
> 1   

$ od -c 1> 1.od
$ od -c 2> 2.od
$ diff 1.od 2.od

1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003

$ od -Ax -c -t x1 1> 1.od
$ od -Ax -c -t x1 2> 2.od
$ diff 1.od 2.od

1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003

1

У мене була така ж проблема, і я знайшов рішення, яке може допомогти, використовуючи команду:

dos2unix <file1> <file2>

одна з них може бути у форматі dos / windows, а друга - у форматі UNIX

після того, як я це зробив, різниця була все добре!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.