diff mostrando solo diferencias dentro de la línea

9

Quiero comparar líneas en dos archivos, pero para minimizar el ruido en la salida, solo quiero que se impriman las diferencias reales en las líneas.

Por ejemplo, dados los dos archivos a continuación:

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 diferencia entre ellos es el caso de la letra b)

Quiero que la salida sea algo como:

[-b-]{+B+}

Actualmente, el mejor enfoque que encontré fue usar git diff --word-diff, pero genera toda la línea:

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

¿Hay una forma más directa de hacerlo, que no sea analizar manualmente la salida? Además, idealmente preferiría usar algo más comúnmente disponible que git diff, por ejemplo, una herramienta de shell POSIX que no requiera que el usuario instale paquetes adicionales.

anol
fuente
Sería bueno si usaras un ejemplo donde las diferencias fueran más visibles. Tuve que entrecerrar los ojos para ver que esos dos personajes no son lo mismo.
Barmar
Lo siento, agregué una nota que describe la diferencia entre las líneas.
anol
¿Por qué no solo usar by Bes obvio? Entiendo que esta fue probablemente la diferencia real, pero a los fines de la pregunta puede facilitarla.
Barmar
1
Quería evitar soluciones que solo funcionarían en caracteres ASCII, pero como la solución propuesta no depende de ella, la cambié. Sin embargo, no puedo actualizar la respuesta para reflejar los nuevos cambios, ya que la edición tendría menos de 6 caracteres.
anol
relacionado: unix.stackexchange.com/questions/11128/diff-within-a-line
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

14

Usando wdiff :

$ wdiff -3 a.txt b.txt

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

La opción -3o ---no-commoneliminará las palabras que son comunes entre los dos archivos y solo mostrarán las diferencias.

El ===...banner (y las líneas vacías) se pueden eliminar con grep:

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

wdifftambién puede leer diffdatos unificados si le da la opción -do --diff-input, por ejemplo, de git:

git diff somefile | wdiff -d -3

Aunque wdiffno es una herramienta POSIX, está comúnmente disponible.

Kusalananda
fuente
Vale la pena señalar que si su terminal admite escapes ANSI, puede hacer que wdiff imprima una salida de color elegante que sea (imo) más fácil de leer con esto en su bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(tomado de aquí ).
scohe001