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.

anol
la source
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
en relation: unix.stackexchange.com/questions/11128/diff-within-a-line
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

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.

Kusalananda
la source
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