diff mostrando apenas diferenças dentro da linha

diff mostrando apenas diferenças dentro da linha

Quero comparar linhas em dois arquivos, mas para minimizar o ruído na saída, quero que apenas as diferenças reais nas linhas sejam impressas.

Por exemplo, dados os dois arquivos abaixo:

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

(a diferença entre eles é o caso de letter b)

Quero que a saída seja algo como:

[-b-]{+B+}

Atualmente, a melhor abordagem que encontrei foi usar git diff --word-diff, mas gera a linha inteira:

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

Existe uma maneira mais direta de fazer isso, além de analisar manualmente a saída? Além disso, idealmente eu preferiria usar algo mais comumente disponível do que git diff, por exemplo, uma ferramenta shell POSIX que não exigisse que o usuário instalasse pacotes extras.

Responder1

Usandowdiff:

$ wdiff -3 a.txt b.txt

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

A opção -3ou ---no-commonremoverá palavras comuns entre os dois arquivos e mostrará apenas as diferenças.

O ===...banner (e as linhas vazias) podem ser removidos com grep:

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

wdifftambém pode ler diffdados unificados se você fornecer a opção -dou --diff-input, por exemplo, de git:

git diff somefile | wdiff -d -3

Embora wdiffnão seja uma ferramenta POSIX, está comumente disponível.

informação relacionada