[LINUX] Comportement exact de diff --ignore-matching-lines = RE

introduction

La commande diff a l'option --ignore-matching-lines = RE. En regardant l'homme, il dit "ignorer les changements où toutes les lignes correspondent à RE" et il semble ignorer quand les différences correspondent à l'expression régulière. De plus, traduction japonaise dit: «Ignorez les modifications qui ne font qu'insérer ou supprimer des lignes qui correspondent à REGEXP. ".

Je pense que ce sont des expressions assez trompeuses. (Je ne sais pas ce que je veux dire en le relisant après l'avoir compris ...) Cette section décrit le comportement exact de cette option.

Exemple concret

Considérez la différence entre les deux fichiers suivants.

file1.txt


Date: 2020/4/7
Time: 20:00:00

file2.txt


Date: 2020/4/6
Time: 21:00:00

Si vous prenez diff normalement

$ diff file1.txt file2.txt
1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Ce sera. Ici, supposons que vous souhaitiez ignorer la différence de date et ne prendre la différence que dans l'heure.

$ diff -I Date file1.txt file2.txt
1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Mais le résultat n'est pas différent. Essayez maintenant d'insérer une ligne vide entre la date et l'heure dans file1.txt et file2.txt.

file1.txt


Date: 2020/4/7

Time: 20:00:00

file2.txt


Date: 2020/4/6

Time: 21:00:00

De même, si vous prenez diff

$ diff -I Date file1.txt file2.txt
3c3
< Time: 20:00:00
---
> Time: 21:00:00

Je n'ai pu récupérer que le temps correctement.

C'est parce que --ignore-matching-lines correspond à un morceau, pas à des lignes. Un morceau est un morceau de différence, dans le premier exemple

1,2c1,2
< Date: 2020/4/7
< Time: 20:00:00
---
> Date: 2020/4/6
> Time: 21:00:00

Est un morceau. Si vous prenez diff normalement avec une ligne vide insérée comme essai

$ diff file1.txt file2.txt
1c1
< Date: 2020/4/7
---
> Date: 2020/4/6
3c3
< Time: 20:00:00
---
> Time: 21:00:00

Et deux mecs. Le comportement correct de --ignore-matching-lines est d'appliquer une correspondance d'expression régulière à chacun de ces morceaux et d'ignorer le premier morceau.

Dans le document

La documentation GNU décrit le comportement exact, y compris celui-ci.

However, -I only ignores the insertion or deletion of lines that contain the regular expression if every changed line in the hunk—every insertion and every deletion—matches the regular expression. In other words, for each nonignorable change, diff prints the complete set of changes in its vicinity, including the ignorable ones.

Comme il est dit "chaque ligne modifiée dans le morceau" ici, il ne sera pas ignoré à moins que toutes les lignes du morceau correspondent à l'expression régulière. Si vous comprenez jusqu'ici, vous comprendrez que le sens de «tout» écrit dans l'homme et le mot «seulement» dans la traduction japonaise se réfèrent à tous les mecs, mais il est assez difficile de le remarquer à première vue. n'est-ce pas….

Recommended Posts

Comportement exact de diff --ignore-matching-lines = RE
Comportement de multiprocessing.pool.Pool.map
[python] comportement d'argmax
comportement de matplotlib: histgramme normé
Comportement de la méthode pandas rolling ()