
Я хочу сравнить строки в двух файлах, но чтобы минимизировать шум в выходных данных, я хочу, чтобы были напечатаны только фактические различия в строках.
Например, рассмотрим два файла ниже:
а.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, он широко доступен.