diff mostra solo differenze all'interno della linea


9

Voglio confrontare le linee in due file, ma per ridurre al minimo il rumore nell'output, voglio solo le differenze effettive nelle linee da stampare.

Ad esempio, dati i due file seguenti:

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

(la differenza tra loro è il caso della lettera b)

Voglio che l'output sia simile a:

[-b-]{+B+}

Attualmente, l'approccio migliore che ho trovato è stato quello di utilizzare git diff --word-diff, ma produce l'intera linea:

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

Esiste un modo più diretto per farlo, oltre all'analisi manuale dell'output? Inoltre, idealmente preferirei usare qualcosa di più comunemente disponibile di git diff, ad esempio uno strumento shell POSIX che non richiederebbe all'utente di installare pacchetti extra.


Sarebbe bello se tu usassi un esempio in cui le differenze fossero più visibili. Ho dovuto strizzare gli occhi per vedere che quei due personaggi non erano uguali.
Barmar,

Spiacente, ho aggiunto una nota che descrive la differenza tra le righe.
anol

Perché non usare be Bquindi è ovvio? Capisco che questa era probabilmente la differenza reale, ma ai fini della domanda puoi renderlo più semplice.
Barmar,

1
Volevo evitare soluzioni che funzionassero solo su caratteri ASCII, ma poiché la soluzione proposta non dipende da essa, l'ho cambiata. Tuttavia, non riesco ad aggiornare la risposta per riflettere le nuove modifiche poiché la modifica sarebbe più piccola di 6 caratteri.
anol

Risposte:


14

Utilizzando wdiff :

$ wdiff -3 a.txt b.txt

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

L' opzione -3o ---no-commonrimuoverà le parole comuni tra i due file e mostrerà solo le differenze.

Il ===...banner (e le righe vuote) può essere rimosso con grep:

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

wdiffpuò anche leggere diffdati unificati se gli dai l' opzione -do --diff-input, ad esempio da git:

git diff somefile | wdiff -d -3

Sebbene wdiffnon sia uno strumento POSIX, è comunemente disponibile.


Vale la pena notare che se il tuo terminale supporta gli escape ANSI, puoi rendere l'output a colori di fantasia di stampa wdiff che è (imo) più facile da leggere con questo nel tuo bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(preso da qui ).
scohe001,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.