2010-12-13 54 views
26

diff a une option -I regexp, qui ignore les modifications qui viennent d'insérer ou de supprimer des lignes correspondant à l'expression rationnelle donnée. J'ai besoin d'un analogue de ceci pour le cas où les changements sont entre deux lignes (plutôt que d'insérer ou de supprimer des lignes).Comment faire pour ignorer certaines différences dans la commande diff?

Par exemple, je veux ignorer toutes les différences comme entre "abXd" et "abYd", pour donné X et Y.

Il semble que diff n'a pas ce genre de capacité. Y a-t-il une alternative appropriée pour diff?

Répondre

18

Vous pouvez filtrer les deux fichiers via sed pour éliminer les lignes dont vous ne tenez pas compte. Le modèle général est /regex1/,/regex2/ d pour supprimer quoi que ce soit entre des lignes correspondant à deux regex. Par exemple:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2) 
+1

Merci pour la réponse. 'sed '/ regex/d' file' supprime toutes les lignes dans' file' où une correspondance de 'regex' se produit. Est-il possible de supprimer non pas la ligne mais seulement la partie correspondante? – Vahagn

+0

Je ne sais pas exactement ce que vous voulez faire. Pouvez-vous éditer votre question avec un exemple de deux fichiers que vous voulez diff et ce que vous voulez que le résultat soit? –

+0

Malheureusement, cela ne fonctionnera pas avec diff (r-r) récursif pour des raisons évidentes. –

0

En supposant que X et Y sont des caractères uniques, alors -I 'ab[XY]d' fonctionne très bien pour moi.

+0

Et pour moi aussi. – user2023370

+6

Ceci ignore complètement la ligne. S'il y a d'autres différences dans la ligne qui vous intéressent, cela les cachera. – CoatedMoose

18

Améliorant la earlier solution par John Kugelman:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2) 

est probablement ce que vous cherchez peut-être! Cette version normalise le changement spécifique sur chaque ligne sans supprimer la ligne elle-même. Cela permet à diff de montrer autres différences qui restent sur la ligne.

1

Vous pouvez utiliser sed pour remplacer les instances du modèle avec une chaîne standard:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)