diff pokazuje tylko różnice wewnątrz linii

9

Chcę porównać linie w dwóch plikach, ale aby zminimalizować szum na wyjściu, chcę, aby drukowane były tylko rzeczywiste różnice w liniach.

Na przykład, biorąc pod uwagę dwa poniższe pliki:

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

(różnica między nimi jest w przypadku listu b)

Chcę, aby wynik był jak:

[-b-]{+B+}

Obecnie najlepszym podejściem, jakie znalazłem, było zastosowanie git diff --word-diff, ale generuje całą linię:

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

Czy istnieje bardziej bezpośredni sposób na to, niż ręczne analizowanie danych wyjściowych? Idealnie wolałbym również użyć czegoś bardziej powszechnie dostępnego niż git diffnp. Narzędzie powłoki POSIX, które nie wymagałoby od użytkownika instalowania dodatkowych pakietów.

anol
źródło
Byłoby miło, gdybyś użył przykładu, w którym różnice były bardziej widoczne. Musiałem zezować, żeby zobaczyć, że te dwie postacie nie są takie same.
Barmar 18.01.19
Przepraszam, dodałem notatkę opisującą różnicę między wierszami.
anol
Dlaczego nie po prostu użyć, ba Bwięc to oczywiste? Rozumiem, że była to prawdopodobnie faktyczna różnica, ale dla celów pytania możesz to ułatwić.
Barmar
1
Chciałem uniknąć rozwiązań, które działałyby tylko na znakach ASCII, ale ponieważ proponowane rozwiązanie nie zależy od niego, zmieniłem je. Nie mogę jednak zaktualizować odpowiedzi, aby odzwierciedlić nowe zmiany, ponieważ edycja byłaby mniejsza niż 6 znaków.
anol
powiązane: unix.stackexchange.com/questions/11128/diff-within-a-line
Ciro Santilli 17 病毒 审查 六四 事件 法轮功

Odpowiedzi:

14

Za pomocą wdiff :

$ wdiff -3 a.txt b.txt

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

Opcja -3lub ---no-commonusunie słowa wspólne dla obu plików i pokaże tylko różnice.

===...Transparent (i pustych linii) może być usunięty z grep:

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

wdiffmoże również czytać zunifikowane diffdane, jeśli dasz mu opcję -dlub --diff-input, na przykład z git:

git diff somefile | wdiff -d -3

Chociaż wdiffnie jest to narzędzie POSIX, jest ono powszechnie dostępne.

Kusalananda
źródło
Warto zauważyć, że jeśli twój terminal obsługuje ucieczki ANSI, możesz sprawić, że wydruk wdiff ma fantazyjne kolorowe wydruki, które (imo) są łatwiejsze do odczytania dzięki temu w twoim bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(pobranym stąd ).
scohe001 18.01.19