diff mostrando apenas diferenças dentro da linha

9

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 da letra b)

Eu quero que a saída seja algo como:

[-b-]{+B+}

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

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 exigiria que o usuário instalasse pacotes extras.

anol
fonte
Seria bom se você usasse um exemplo em que as diferenças fossem mais visíveis. Eu tive que apertar os olhos para ver que esses dois personagens não são os mesmos.
Barmar 18/01/19
Desculpe, adicionei uma nota descrevendo a diferença entre as linhas.
anol 18/01/19
Por que não usar be, Bportanto, é óbvio? Entendo que essa era provavelmente a diferença real, mas, para fins da pergunta, você pode facilitar.
Barmar 18/01/19
1
Eu queria evitar soluções que funcionassem apenas com caracteres ASCII, mas como a solução proposta não depende disso, eu a alterei. No entanto, não consigo atualizar a resposta para refletir as novas alterações, pois a edição seria menor que 6 caracteres.
anol 18/01/19

Respostas:

14

Usando wdiff :

$ wdiff -3 a.txt b.txt

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

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

O ===...banner (e linhas vazias) pode ser removido com grep:

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

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

git diff somefile | wdiff -d -3

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

Kusalananda
fonte
Pode ser interessante notar que, se o seu terminal suportar escapes ANSI, você pode facilitar a impressão colorida de wdiff, que é (imo) mais fácil de ler com isso no seu bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(extraído daqui ).
scohe001