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

9

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

Например, учитывая два файла ниже:

a.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.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, который не требовал бы от пользователя установки дополнительных пакетов.

Anol
источник
Было бы хорошо, если бы вы использовали пример, где различия были более заметны. Мне пришлось щуриться, чтобы увидеть, что эти два персонажа не одинаковы.
Бармар
Извините, я добавил примечание, описывающее разницу между строками.
Anol
Почему бы просто не использовать, bи Bэто очевидно? Я понимаю, что это, вероятно, было реальной разницей, но для целей вопроса вы можете сделать это проще.
Бармар
1
Я хотел избежать решений, которые будут работать только на символах ASCII, но, поскольку предлагаемое решение не зависит от него, я изменил его. Однако я не могу обновить ответ, чтобы отразить новые изменения, так как редактирование будет менее 6 символов.
Anol
связанные: unix.stackexchange.com/questions/11128/diff-within-a-line
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

14

Используя wdiff :

$ wdiff -3 a.txt b.txt

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

Опция -3or ---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, он обычно доступен.

Кусалананда
источник
Возможно, стоит отметить, что, если ваш терминал поддерживает экранирование ANSI, вы можете сделать вывод wdiff причудливой цветной печати, который (imo) будет легче читать с этим в вашем bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(взято отсюда ).
scohe001