Использование 'diff' (или чего-либо еще) для получения различий на уровне символов между текстовыми файлами - PullRequest
72 голосов
/ 12 ноября 2009

Я хотел бы использовать '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

Вы меня поняли.

Теперь я знаю, что могу использовать другие двигатели , чтобы отметить / проверить разницу в конкретной строке. Но я бы предпочел использовать один инструмент, который делает все это.

Ответы [ 14 ]

1 голос
/ 23 октября 2013

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

#!/bin/env python

def readfile( fileName ):
    f = open( fileName )
    c = f.read()
    f.close()
    return c

def diff( s1, s2 ):
    counter=0
    for ch1, ch2 in zip( s1, s2 ):
        if not ch1 == ch2:
            break
        counter+=1
    return counter < len( s1 ) and counter or -1

import sys

f1 = readfile( sys.argv[1] )
f2 = readfile( sys.argv[2] )
pos = diff( f1, f2 )
end = pos+200

if pos >= 0:
    print "Different at:", pos
    print ">", f1[pos:end]
    print "<", f2[pos:end]

Вы можете сравнить два файла со следующим синтаксисом на вашем любимом терминале:

$ ./diff.py fileNumber1 fileNumber2
0 голосов
/ 17 февраля 2019

В большинстве этих ответов упоминается использование diff-highlight , модуля Perl. Но я не хотел выяснять, как установить модуль Perl. Поэтому я сделал несколько небольших изменений, чтобы он стал автономным скриптом Perl.

Вы можете установить его, используя:

▶ curl -o /usr/local/bin/DiffHighlight.pl \
   https://raw.githubusercontent.com/alexharv074/scripts/master/DiffHighlight.pl

И использование (если у вас есть Ubuntu colordiff, упомянутый в ответе zhanxw):

▶ diff -u f1 f2 | colordiff | DiffHighlight.pl

И использование (если вы этого не сделаете):

▶ diff -u f1 f2 | DiffHighlight.pl
0 голосов
/ 20 ноября 2017

Не полный ответ, но если вывод cmp -l недостаточно ясен, вы можете использовать:

sed 's/\(.\)/\1\n/g' file1 > file1.vertical
sed 's/\(.\)/\1\n/g' file2 > file2.vertical
diff file1.vertical file2.vertical
0 голосов
/ 26 марта 2013

Если вы храните свои файлы в Git, вы можете различать версии с помощью сценария diff-highlight , который будет показывать разные строки с выделением различий.

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

...