Я хотел бы использовать 'diff', чтобы получить разницу между строками и символами. Например, рассмотрим:
Файл 1
abcde
abc
abcccd
Файл 2
abcde
ab
abccc
Используя diff -u, я получаю:
@@ -1,3 +1,3 @@
abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Однако это только показывает мне, что были изменения в этих строках. Я бы хотел увидеть что-то вроде:
@@ -1,3 +1,3 @@
abcde
-ab<ins>c</ins>
-abccc<ins>d</ins>
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Вы меня поняли.
Теперь я знаю, что могу использовать другие движки, чтобы отмечать / проверять разницу в определенной строке. Но я бы предпочел использовать один инструмент, который все это делает.
text
command-line
diff
ВиталийБ
источник
источник
Ответы:
В Git есть слово diff, и определение всех символов как слов фактически дает вам различие символов. Однако изменения новой строки игнорируются .
пример
Создайте такой репозиторий:
А теперь сделайте,
git diff --word-diff=color --word-diff-regex=. master^ master
и вы получите:Обратите внимание на то, что и добавления, и удаления распознаются на уровне символа, в то время как добавление и удаление новых строк игнорируются.
Вы также можете попробовать одно из следующих:
источник
git diff --word-diff=color --word-diff-regex=. file1 file2
--no-index
ответ @ qwertzguys выше, чтобы заставить его работать для меня вне репозитория git. Итак:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
--no-index
в репоТы можешь использовать:
colordiff
это пакет Ubuntu. Вы можете установить его, используяsudo apt-get install colordiff
.diff-highlight
взято из git (начиная с версии 2.9). Он расположен в/usr/share/doc/git/contrib/diff-highlight/diff-highlight
. Вы можете поместить его где-нибудь в свой$PATH
.источник
brew install colordiff
diff-highlight
в$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
diff-highlight
также можно установить с помощью python pip -pip install diff-highlight
(я предпочитаю его, даже если git установлен с помощью brew)Если вы хотите делать это программно, то вам подойдет Python difflib . Для интерактивного использования я использую vim режим diff (достаточно простой в использовании: просто вызовите vim с помощью
vimdiff a b
). Я также иногда использую Beyond Compare , который делает почти все, на что вы можете надеяться от инструмента сравнения.Я не видел никакого инструмента командной строки, который бы делал это с пользой, но, как отмечает Уилл, пример кода diffflib может помочь.
источник
Вы можете использовать
cmp
команду в Solaris:источник
cmp
также доступен (по крайней мере, в некоторых) дистрибутивах Linux.-l -b
.У Python есть удобная библиотека с именем,
difflib
которая может помочь ответить на ваш вопрос.Ниже приведены два oneliner'а, которые используются
difflib
для разных версий python.Они могут пригодиться в качестве псевдонима оболочки, который легче перемещать с вашим
.${SHELL_NAME}rc
.И более читабельную версию поместить в отдельный файл.
источник
Хорошо сработало для меня. Крайний левый номер результата указывает количество различающихся символов.
источник
cmp -l file1 file2 | wc -l
Я также написал свой собственный сценарий для решения этой проблемы с использованием алгоритма самой длинной общей подпоследовательности.
Он выполнен как таковой
JLDiff.py a.txt b.txt out.html
Результат - HTML с красно-зеленой окраской. Для обработки больших файлов экспоненциально требуется больше времени, но при этом выполняется истинное сравнение символов без проверки сначала построчно.
источник
Цветной вывод на уровне персонажа
diff
Вот что вы можете сделать с помощью приведенного ниже скрипта и функции diff-highlight (которая является частью git):
(Кредит на ответ @retracile за
sed
выделение)источник
command | gvim -
буду делать то, что ты хочешь.git
но не помещается на ваш путь. На одной из моих машин эта живет/usr/share/doc/git/contrib/diff-highlight
.Диффлиб Python может это сделать.
Документация включает в себя пример программы командной строки для вас.
Точный формат не такой, как вы указали, но было бы просто либо проанализировать вывод в стиле ndiff, либо изменить пример программы для создания вашей нотации.
источник
Вот онлайн-инструмент для сравнения текстов: http://text-compare.com/
Он может выделить каждый отдельный символ, который отличается, и продолжить сравнение остальных.
источник
catdog
иcat\ndog
будет соответствовать толькоcat
Я думаю, что более простое решение всегда будет хорошим решением. В моем случае мне очень помогает приведенный ниже код. Я надеюсь, что это поможет кому-нибудь еще.
Вы можете сравнить два файла со следующим синтаксисом на своем любимом терминале:
источник
Если вы храните свои файлы в Git, вы можете различать версии с помощью скрипта diff-highlight , который будет показывать разные строки с выделенными различиями.
К сожалению, это работает только тогда, когда количество удаленных строк совпадает с количеством добавленных строк - есть код-заглушка, когда строки не совпадают, поэтому, по-видимому, это можно исправить в будущем.
источник
Не полный ответ, но если
cmp -l
вывод недостаточно ясен, вы можете использовать:источник
В большинстве этих ответов упоминается использование модуля Perl diff-highlight . Но я не хотел выяснять, как установить модуль Perl. Поэтому я внес в него несколько незначительных изменений, чтобы он стал автономным скриптом Perl.
Вы можете установить его, используя:
И использование (если у вас есть Ubuntu,
colordiff
упомянутый в ответе zhanxw):И использование (если вы этого не сделаете):
источник
ccdiff
удобный специализированный инструмент для решения поставленной задачи. Вот как выглядит ваш пример:По умолчанию он выделяет различия в цвете, но его можно использовать и на консоли без поддержки цвета.
Пакет включен в основной репозиторий Debian:
источник