Using 'diff' (or anything else) to get character-level diff between text files

前端 未结 15 2179
借酒劲吻你
借酒劲吻你 2020-12-02 05:40

I\'d like to use \'diff\' to get a both line difference between and character difference. For example, consider:

File 1

abcde
ab         


        
相关标签:
15条回答
  • 2020-12-02 06:25

    You can use:

    diff -u f1 f2 |colordiff |diff-highlight
    

    colordiff is a Ubuntu package. You can install it using sudo apt-get install colordiff.

    diff-highlight is from git (since version 2.9). It is located in /usr/share/doc/git/contrib/diff-highlight/diff-highlight. You can put it somewhere in your $PATH.

    0 讨论(0)
  • 2020-12-02 06:26

    Python's difflib can do this.

    The documentation includes an example command-line program for you.

    The exact format is not as you specified, but it would be straightforward to either parse the ndiff-style output or to modify the example program to generate your notation.

    0 讨论(0)
  • 2020-12-02 06:26

    Most of these answers mention using of diff-highlight, a Perl module. But I didn't want to figure out how to install a Perl module. So I made a few minor changes to it to be a self-contained Perl script.

    You can install it using:

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

    And the usage (if you have the Ubuntu colordiff mentioned in zhanxw's answer):

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

    And the usage (if you don't):

    ▶ diff -u f1 f2 | DiffHighlight.pl
    
    0 讨论(0)
  • 2020-12-02 06:28

    I think the simpler solution is always a good solution. In my case, the below code helps me a lot. I hope it helps anybody else.

    #!/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]
    

    You can compare two files with the following syntax at your favorite terminal:

    $ ./diff.py fileNumber1 fileNumber2
    
    0 讨论(0)
  • 2020-12-02 06:30

    If you keep your files in Git, you can diff between versions with the diff-highlight script, which will show different lines, with differences highlighted.

    Unfortunately it only works when the number of lines removed matches the number of lines added - there is stub code for when lines don't match, so presumably this could be fixed in the future.

    0 讨论(0)
  • 2020-12-02 06:34

    Git has a word diff, and defining all characters as words effectively gives you a character diff. However, newline changes are ignored.

    Example

    Create a repository like this:

    mkdir chardifftest
    cd chardifftest
    git init
    echo -e 'foobarbaz\ncatdog\nfox' > file
    git add -A; git commit -m 1
    echo -e 'fuobArbas\ncat\ndogfox' > file
    git add -A; git commit -m 2
    

    Now, do git diff --word-diff=color --word-diff-regex=. master^ master and you'll get:

    Note how both additions and deletions are recognized at the character level, while both additions and deletions of newlines are ignored.

    You may also want to try one of these:

    git diff --word-diff=plain --word-diff-regex=. master^ master
    git diff --word-diff=porcelain --word-diff-regex=. master^ master
    
    0 讨论(0)
提交回复
热议问题