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

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

1c1
< 1
---
> 1

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

5 ответов

Решение

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 столбца.

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

В приведенном ниже примере я создаю пару файлов, которые могут быть похожи на исходные, а затем выполняю 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

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

dos2unix <file1> <file2>

один из них может быть в формате DOS / Windows, а другой формат UNIX

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

Очень вероятно, что в одной из строк прячется непечатаемый персонаж. Просто направьте вывод вcat -t для отображения любых непечатаемых символов:

diff file1 file2 | cat -t

Не уверен, поможет ли это трудно найти пробельные символы, но это удобно для сравнения: http://www.gnu.org/software/wdiff/

http://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html

Выше ссылка обеспечивает более краткое и четкое описание.

Другие вопросы по тегам