Разница сообщает разницу, но обе строки одинаковы

55

Я отправил 2 файла и получил

1c1
< 1
---
> 1

Оба файла содержали только «1». Чем это отличается?

Jiew Meng
источник
опубликовать содержимое обоих файлов, пожалуйста;)
Rinzwind
5
Если вы используете diff, -uопция может быть более удобочитаемой.
Лекенштейн
@Rinzwind, оба файла содержат только текст 1, но если вы хотите увидеть больше, смотрите pastebin.com/byiqdie1
Jiew Meng
Сожалею. Это не когда я это делаю. Там должно быть что-то другое. Сделайте a cp 1 2(перезаписайте 2), и тогда вы будете на 100% уверены, что они одинаковы;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc

Ответы:

68

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

2-я строка: строка с <файлом 1 и отличается от файла 2.

3-я строка - это разделитель.

4-я строка: строка с >файлом 2 и отличается от файла 1.

(Если вы когда-либо видите, =это означает, что строки в обоих файлах одинаковы)

И вашей проблемой могут быть пробелы или другие нечитаемые человеком символы: они тоже вызывают разницу.

Есть несколько вариантов манипулирования выводом.

Пример:

rinzwind @ discworld: ~ $ больше 1 
контрольная работа
test2
test3
rinzwind @ discworld: ~ $ больше 2
контрольная работа
test2  
test3

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

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 ****
  контрольная работа
! test2
  test3
--- 1,3 ----
  контрольная работа
! test2  
  test3

"!" представляет изменение между строками, которые соответствуют в двух файлах. «+» Представляет добавление строки, в то время как пробел представляет неизменную строку. В начале патча находится информация о файле, включая полный путь и отметку времени. В начале каждого блока находятся номера строк, которые применяются для соответствующего изменения в файлах. Диапазон номеров, появляющийся между наборами из трех звездочек, применяется к исходному файлу, в то время как наборы из трех тире применяются к новому файлу. Диапазоны блоков указывают номера начальной и конечной строк в соответствующем файле.

Расширение комментария Лекенштейна об унифицированном формате:

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 @@
 контрольная работа
-test2
+ test2  
 test3

Формат начинается с того же двухстрочного заголовка, что и контекстный формат, за исключением того, что исходному файлу предшествует «---», а новому файлу предшествует «+++». Далее следует один или несколько блоков изменений, которые содержат различия строк в файле. Неизменным контекстным строкам предшествует пробел, строкам добавления предшествует знак плюс, а линиям удаления предшествует знак минус.

Несколько полезных опций:

-b Игнорировать изменения количества пустого пространства.

-w Игнорировать все пустое пространство.

-B Игнорировать все пустые строки.

-y вывод в 2 столбца.

Rinzwind
источник
Как проверить, есть ли скрытые символы? Есть ли способ игнорировать скрытые символы (может быть, исключая символы новой строки и табуляции?) Я полагаю, что большинство скрытых символов являются случайными?
Jiew Meng
Я вставил несколько полезных опций (скопировано с man diff;))
Rinzwind
Я заметил, что использование флага -b работает. Хм, я не вижу разницы в пробелах в gedit :)
Jiew Meng
@JiewMeng Запустите od -x1zоба файла и сравните odвывод. Это должно найти любые скрытые различия между файлами.
января
6

Я считаю, что od (восьмеричный дамп) удобен при сравнении файлов с непечатаемыми символами (в частности, файлы, которые diff определяет как «двоичные» и, таким образом, сообщают только о том, что они различаются).

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

$ 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

после того, как я сделал это, различия были все хорошо!

levk
источник