відмінний, показуючи лише відмінності всередині рядка


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+}
======================================================================

Опція -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, він зазвичай доступний.


Можливо, варто відзначити, що якщо ваш термінал підтримує втечу 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.