
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 -3
ou ---no-common
removerá 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+}
wdiff
também pode ler diff
dados unificados se você fornecer a opção -d
ou --diff-input
, por exemplo, de git
:
git diff somefile | wdiff -d -3
Embora wdiff
não seja uma ferramenta POSIX, está comumente disponível.