Gibt es ein Tool zum zeichenweisen Textunterschied?

Ich muss ständig zwei Textdateien mit fester Breite vergleichen, die sich an bestimmten Zeichenpositionen ändern. Diese Dateien haben normalerweise eine einzelne Zeile und eine feste Anzahl von Bytes, sodass die meisten Diff-Tools die gesamte Zeile als unterschiedlich markieren, aber nicht angeben, welche Zeichen die spezifischen sind, die umleiten.

Gibt es ein Tool, das auf diese Art von Dateien spezialisiert ist? Ich kann nur zeilenweise Werkzeuge finden. Es ist mir egal, auf welcher Plattform die Tools laufen.

Welches Betriebssystem?
Was für Unterschiede? Einfache Zeichenersetzungen oder werden auch Zeichen eingefügt oder gelöscht?

Antworten (2)

Mit ein paar Zeilen Python können Sie dies tun:

Python ist auf den meisten OS-X- und Linux-Installationen vorinstalliert, lässt sich auf den übrigen mit installieren apt-getund ist für Windows verfügbar.

Beispielcode:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys

def diffline(l1, l2):
    """ Difference a pair of lines."""
    print("A:", l1.strip())
    print("B:", l2.strip())
    delta = ["   "]
    for n in xrange(min([len(l1), len(l2)])):
        if l1[n] == l2[n]:
            delta.append(' ')
        else:
            delta.append('^')
    excess = abs(len(l1) - len(l2))
    delta.append('^' * excess)
    print("".join(delta))


def linedelta(fname1, fname2):
    """
    Compare lines in two text files and mark the position of deltas.
    """
    print("A =", fname1)
    print("B =", fname2)
    line_no = 0
    l1 = "???"
    l2 = "!!!"
    with open(fname1, 'rt') as f1:
        with open(fname2, 'rt') as f2:
            while len(l1) and len(l2):
                line_no += 1
                l1 = f1.readline()
                l2 = f2.readline()
                if l1 <> l2:
                    print("Line:", line_no)
                    diffline(l1, l2)
    if not len(l1) + len(l2):
        print("Files differ after line", line_no)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage:\n\tLineDelta.py file1 file2")
    else:
        linedelta(sys.argv[1], sys.argv[2])

Beispieleingaben

Test1.txt:

ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACBACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC

Test2.txt:

ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACCACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC

Testlauf

Laufen LineDelta.py Test1.txt Test2.txtgibt:

A = test1.txt
B = test2.txt
Line: 2
A: CBACBACBACBACBACBACBACBACBACBACBACBA
B: CBACBACBACBACBACBACBACBACBACCACBACBA
                               ^

NB Es sind schnellere, kürzere und elegantere Implementierungen möglich, aber ich denke, dass das obige wahrscheinlich verständlicher ist.

Meld zeigt dir veränderte Charaktere in tiefblau:

Charakter diff

Geänderte Zeilen werden hellblau angezeigt, sodass Sie zuerst die Zeile und dann das Zeichen erkennen können.

Kostenlos, Open-Source.