diff montrant uniquement les différences à l'intérieur de la ligne


9

Je veux comparer des lignes dans deux fichiers, mais pour minimiser le bruit dans la sortie, je veux seulement que les différences réelles dans les lignes soient imprimées.

Par exemple, étant donné les deux fichiers ci-dessous:

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 différence entre eux est le cas de la lettre b)

Je veux que la sortie soit quelque chose comme:

[-b-]{+B+}

Actuellement, la meilleure approche que j'ai trouvée était d'utiliser git diff --word-diff, mais elle génère toute la ligne:

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-t-il un moyen plus direct de le faire, autre que l'analyse manuelle de la sortie? Aussi, idéalement, je préférerais utiliser quelque chose de plus communément disponible git diff, par exemple un outil shell POSIX qui ne nécessiterait pas que l'utilisateur installe des packages supplémentaires.


Ce serait bien si vous utilisiez un exemple où les différences étaient plus visibles. J'ai dû plisser les yeux pour voir que ces deux personnages ne sont pas les mêmes.
Barmar

Désolé, j'ai ajouté une note décrivant la différence entre les lignes.
anol

Pourquoi ne pas simplement l'utiliser bet Bc'est donc évident? Je comprends que c'était probablement la différence réelle, mais pour les besoins de la question, vous pouvez le rendre plus facile.
Barmar

1
Je voulais éviter les solutions qui ne fonctionneraient que sur des caractères ASCII, mais comme la solution proposée n'en dépend pas, je l'ai modifiée. Cependant, je ne peux pas mettre à jour la réponse pour refléter les nouvelles modifications car la modification comporterait moins de 6 caractères.
anol

Réponses:


14

Utilisation de wdiff :

$ wdiff -3 a.txt b.txt

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

L' option -3ou ---no-commonsupprimera les mots communs aux deux fichiers et n'affichera que les différences.

La ===...bannière (et les lignes vides) peuvent être supprimées avec grep:

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

wdiffpeut également lire des diffdonnées unifiées si vous lui donnez l' option -dou --diff-input, par exemple à partir de git:

git diff somefile | wdiff -d -3

Bien qu'il wdiffne s'agisse pas d'un outil POSIX, il est généralement disponible.


Il peut être intéressant de noter que si votre terminal prend en charge les échappements ANSI, vous pouvez rendre la sortie de couleur fantaisie wdiff plus facile à lire avec (imo) avec ceci dans votre bashrc: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(extrait d' ici ).
scohe001
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.