diff показывает только различия внутри строки

diff показывает только различия внутри строки

Я хочу сравнить строки в двух файлах, но чтобы минимизировать шум в выходных данных, я хочу, чтобы были напечатаны только фактические различия в строках.

Например, рассмотрим два файла ниже:

а.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z

б.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z

(разница между ними — регистр букв b)

Я хочу, чтобы вывод был примерно таким:

[-b-]{+B+}

На данный момент лучшим подходом, который я нашел, было использование git diff --word-diff, но он выводит всю строку:

a [-b-]{+B+} c d e f g h i j k l m n o p q r s t u v w x y z

Есть ли более прямой способ сделать это, кроме ручного разбора вывода? Кроме того, в идеале я бы предпочел использовать что-то более общедоступное, чем git diff, например, инструмент оболочки POSIX, который не потребует от пользователя установки дополнительных пакетов.

решение1

С использованиемwdiff:

$ wdiff -3 a.txt b.txt

======================================================================
 [-b-] {+B+}
======================================================================

Параметр -3или ---no-commonудалит общие слова в двух файлах и покажет только различия.

Баннер ===...(и пустые строки) можно удалить с помощью grep:

$ wdiff -3 a.txt b.txt | grep -vx '=*'
 [-b-] {+B+}

wdiffможет также считывать унифицированные diffданные, если вы укажете ему параметр -dили --diff-input, например из git:

git diff somefile | wdiff -d -3

Хотя wdiffэто не инструмент POSIX, он широко доступен.

Связанный контент