Есть ли инструмент для различения текста по символам?

Мне постоянно нужно сравнивать пары текстовых файлов с фиксированной шириной, которые меняются на определенных позициях символов. Эти файлы обычно имеют одну строку и фиксированное количество байтов, поэтому большинство инструментов сравнения помечают всю строку как другую, но не указывают, какие символы являются конкретными, которые отклоняются.

Есть ли какой-нибудь инструмент, специализированный для такого рода файлов? Я могу найти только линейные инструменты. Я не против платформы, на которой работают инструменты.

Какая операционная система?
Какие различия? Простая замена символов или символы также вставляются или удаляются?

Ответы (2)

С помощью пары строк python вы можете сделать это:

Python предустановлен в большинстве установок OS-X и Linux, может быть установлен на остальных с помощью apt-getи доступен для Windows.

Пример кода:

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

Пример ввода

Тест1.txt:

ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACBACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC

Тест2.txt:

ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACCACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC

Тестовый забег

Бег LineDelta.py Test1.txt Test2.txtдает:

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

NB Возможны более быстрые, короткие и элегантные реализации, но я думаю, что приведенное выше, вероятно, более понятно.

Meld показывает, что вы изменили символы темно-синим цветом:

Разница между персонажами

Измененная строка отображается голубым цветом, поэтому вы можете сначала увидеть строку, а затем символ.

Бесплатно, с открытым исходным кодом.