Разница между пробелами между двумя файлами в Linux

У меня есть два файла, которые при сравнении с diff показывают, что каждая строка изменилась. Когда я сравниваю их с diff -w (игнорируя пробелы), он показывает несколько минимальных изменений, которые я ожидаю.

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

Я использовал vim с :set list on, чтобы подтвердить, что в конце строк не было конечного пространства.

Я также считаю, что в каждом файле есть терминаторы линии Linux, так как vim не показывал ^M в конце строк.

12 голосов | спросил Romski 4 FebruaryEurope/MoscowbWed, 04 Feb 2015 09:50:26 +0300000000amWed, 04 Feb 2015 09:50:26 +030015 2015, 09:50:26

5 ответов


6

Для пользователей vim есть удобная утилита для отображения точных различий между файлами:

vimdiff file1 file2

Это поместит каждый файл в окна, бок о бок и различия с выделенным цветом.

Некоторые полезные команды, когда в vimdiff

В vimdiff, некоторые полезные команды:

  • ]c: перейти к следующему изменению

  • [c: перейти к предыдущему изменению

  • ctrl-W ctrl-W: перейти в другое окно

  • zo: открытые складки

  • zc: закрыть складки

Пример

Вот пример vimdiff в xterm сравнение двух версий конфигурационного файла cups:

введите описание изображения здесь

Вы можете видеть, что длинные разделы идентичных строк были свернуты. Их можно снова открыть с помощью zo.

Цветовая схема будет меняться в зависимости от ваших параметров. В приведенном выше примере, когда строка появляется в одном файле, но не в другой, этой строке задается темно-синий фон. В другом файле недостающие строки обозначены пунктирными линиями. Когда строка появляется в обоих файлах, но имеет некоторые отличия, неизменные части линий имеют розовый фон, а измененные части имеют красный фон.

ответил John1024 4 FebruaryEurope/MoscowbWed, 04 Feb 2015 10:24:40 +0300000000amWed, 04 Feb 2015 10:24:40 +030015 2015, 10:24:40
10

В FreeBSD или большинстве Linux-систем вы можете вывести вывод diff через cat -v -e -t, чтобы показать различия в пробелах.

diff file1 file2 | cat -vet

Вкладки будут отображаться как ^I, a $ будет отображаться в конце каждой строки, чтобы вы могли видеть конечные пробелы, а непечатаемые символы будут отображаться как ^X или M-X.

Если у вас есть GNU coreutils (доступно для большинства дистрибутивов Linux без загрузки), это можно упростить до

diff file1 file2 | cat -A

В системах busybox используйте catv -vet.

ответил Mark Plotnick 11 Maypm15 2015, 17:06:05
2

Был ли один из файлов отредактирован на машине Windows?

Стандартное завершение строки в Windows - это CRLF, где в Linux это просто LF (а на Mac - CR, но я подозреваю, что это было изменено с OS X).

Попробуйте wc -l в файлах и посмотрите, сколько строк, а затем посмотрите, совпадает ли разница в размерах с количеством строк ( последняя строка не может быть завершена в одном файле).

ответил fencepost 4 FebruaryEurope/MoscowbWed, 04 Feb 2015 09:55:59 +0300000000amWed, 04 Feb 2015 09:55:59 +030015 2015, 09:55:59
2

od может помочь. Команда Octal Dump может отображать содержимое в шестнадцатеричном формате. Это может помочь вам увидеть, какие байты, включая нулевые байты или неожиданное пустое пространство, находятся в файле. Возможными общими причинами могут быть LF vs CRLF, вкладки против пробелов или ASCII vs Unicode (которые часто могут иметь нулевой байт перед каждым нормально видимым байтом). od -x filename должен показывать любой из этих шаблонов. Если вам нужен более сложный способ просмотра файла, любой «шестнадцатеричный редактор» может сделать красиво. Хорошая вещь о od заключается в том, что, подобно cut, он встроен во многие Unix-системы. Поэтому часто не требуется отдельная установка.

Если вам нужны более похожие файлы, tr может внести некоторые изменения и sed может сделать больше. Я бы, вероятно, начинал с ls -l, чтобы посмотреть, какой файл больше, затем просмотрите байты, чтобы увидеть, что нужно изменить, а затем измените один из файлы, чтобы они казались более похожими.

ответил TOOGAM 4 FebruaryEurope/MoscowbWed, 04 Feb 2015 10:24:29 +0300000000amWed, 04 Feb 2015 10:24:29 +030015 2015, 10:24:29
0

Здесь был скопирован следующий контент из раздела «вопрос», который был написан Romski.

Оба vimdiff и diff file1 file2 | cat -A были очень полезно с точки зрения инструментов.

Наконец, я нашел еще одну проблему. Некоторые из моих файлов были закодированы с помощью спецификации UTF-8. Это было выделено с помощью diff file1 file2 | cat -A. Это проявилось как M-oM-;M-? в начале затронутого файла:

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

В то время как было несколько проблем, я перечислил пару команд ниже для тех, кто нуждается в очистке своих файлов:

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
ответил chaos 4 FebruaryEurope/MoscowbWed, 04 Feb 2015 10:11:58 +0300000000amWed, 04 Feb 2015 10:11:58 +030015 2015, 10:11:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132