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

Почему бы просто не использовать, bи Bэто очевидно? Я понимаю, что это, вероятно, было реальной разницей, но для целей вопроса вы можете сделать это проще.
Бармар

1
Я хотел избежать решений, которые будут работать только на символах ASCII, но, поскольку предлагаемое решение не зависит от него, я изменил его. Однако я не могу обновить ответ, чтобы отразить новые изменения, так как редактирование будет менее 6 символов.
Anol

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.