В отчетах о различиях два файла отличаются, хотя они одинаковы!

31

У меня есть два файла, которые выглядят одинаково для меня (включая конечные пробелы и символы новой строки), но diff все равно говорит, что они различаются. Даже когда я делаю diff -yпараллельное сравнение, линии выглядят совершенно одинаково. Выходные данные из diff - это целые 2 файла.

Есть идеи, что вызывает это?

MinaHany
источник
3
Попробуйте сравнить непечатные символы. Самый простой способ их посмотреть sed -n l filename. Если это не поможет, добавьте пример данных и diffвыведите здесь.
Раш
1
Ах, да, спасибо, строки в файле оканчиваются на $, а в другом - на \ r $
MinaHany
1
Быстрое решение состоит в том, чтобы использовать dos2unix для обоих файлов (или для файла, который вы подозреваете, с компьютера с Windows).
Chembrad
В качестве дополнения к существующим ответам: fileкоманда намекнуть вам о содержании файла, в том числе таких вещей , как ASCII text, with CRLF line terminatorsпротив ASCII text.
Стефан Гурихон

Ответы:

29

Странно .. ты можешь попробовать cmp? Вы также можете использовать -bопцию «».

Страница man cmp - Сравнение двух файлов побайтно.

Это одна из приятных вещей в Unix / Linux .. так много инструментов :)

Левон
источник
2
Спасибо за это! Я получил: байт 19, строка 1 - 15 ^ M 12 ^ J, что это значит?
MinaHany
3
выглядит как возврат каретки и перевод строки в соответствии с этой таблицей
Левон
2
попробовал -b с разницей, и это, кажется, работает для меня. Страница man говорит, -bчто для ignore changes in the amount of white space.
rahul.deshmukhpatil
17

Могут ли различия быть вызваны окончаниями строк DOS или UNIX или чем-то подобным?

Что делать, если вы hexdumpих? Это может показать различия более очевидно, например:

hexdump -C file1 > file1.hex
hexdump -C file2 > file2.hex
diff file1.hex file2.hex
МРБ
источник
Ну, два гекса разных. каждый раз, когда в файле 0d 0a, у другого просто
0a
3
В одном у вас есть окончания строки DOS (CRLF), а в другом - окончания строки UNIX (LF). Вот почему они выглядят по-разному, но не когда вы смотрите на них визуально. Посмотрите на en.wikipedia.org/wiki/Newline#Conversion_utilities
mrb
Понял! Большое спасибо. Предложение Левона об использовании cmp показывает более четкую разницу :)
MinaHany
17

Пытаться:

diff file1 file2 | cat -t

-tОпция заставит catпоказать специальные символы четко - например. ^Mдля CR, ^Iдля таб.

Со страницы руководства (OS X):

 -t      Display non-printing characters (see the -v option), and display tab characters as `^I'.

 -v      Display non-printing characters so they are visible.
         Control characters print as `^X' for control-X; the delete character
         (octal 0177) prints as `^?'.  Non-ASCII characters
         (with the high bit set) are printed as `M-' (for meta) followed by the
         character for the low 7 bits.
JosephH
источник
4

Мое первое предположение, которое оказывается подтвержденным, заключается в том, что файлы используют разные окончания строк. Это может быть какое-то другое различие в пробелах, например, наличие пробелов в конце (но вы, как правило, не получите это во многих строках) или различный отступ (табуляция или пробел). Используйте команду, которая печатает пробелы и управляющие символы в видимой форме, например

diff <(cat -A file1) <(cat -A file2)
diff <(sed -n l file1) <(sed -n l file2)

Вы можете подтвердить, что различия связаны только с окончаниями строк, сначала нормализовав их. У вас может быть dos2unixполезность; если нет, удалите лишний символ CR (^ M, \ r, \ 015) явно:

diff <(tr -d '\r' <file1) <(tr -d '\r' <file2)

или, если file1это тот, с окончаниями DOS

 tr -d '\r' <file1 | diff - file2
Жиль "ТАК - прекрати быть злым"
источник