J'ai deux fichiers de configuration, l'original du gestionnaire de paquets et un personnalisé modifié par moi-même. J'ai ajouté quelques commentaires pour décrire le comportement.
Comment puis-je exécuter diff
sur les fichiers de configuration, en ignorant les commentaires? Une ligne commentée est définie par:
- espaces optionnels principaux (onglets et espaces)
- signe de hachage (
#
) - autre chose
L'expression régulière (la plus simple) ignorant la première condition serait #.*
. J'ai essayé l' option --ignore-matching-lines=RE
( -I RE
) de GNU diff 3.0, mais je ne pouvais pas la faire fonctionner avec cette RE. J'ai aussi essayé .*#.*
et .*\#.*
sans chance. Mettre littéralement la ligne ( Port 631
) comme RE
ne correspond à rien, cela n'aide pas non plus de mettre le RE entre les barres obliques.
Comme suggéré dans l' outil “diff”, la saveur de regex semble manquer? , J'ai essayé grep -G
:
grep -G '#.*' file
Cela semble correspondre aux commentaires, mais cela ne fonctionne pas diff -I '#.*' file1 file2
.
Alors, comment utiliser cette option? Comment puis-je faire diff
sauter certaines lignes (dans mon cas, les commentaires)? Ne suggérez pas grep
le fichier et ne comparez pas les fichiers temporaires.
la source
-I
option ne permet d’ignorer un bloc que si toutes ses lignes correspondent à l’expression rationnelle. Ainsi, vous pouvez ignorer un changement de commentaire uniquement de cette manière, mais pas les changements de commentaire qui se rapprochent d'un changement sans commentaire.diff -I
ne me comporte pas comme prévu. J'ai mis à jour ma réponse avec un exemple qui clarifiait ce comportement pour moi.Réponses:
Selon Gilles, l'
-I
option n'ignore une ligne que si rien d'autre à l'intérieur de cet ensemble ne correspond sauf à la correspondance de-I
. Je ne l'ai pas complètement compris avant de l'avoir testé.Le test
Trois fichiers sont impliqués dans mon test:
Fichier
test1
:Fichier
test2
:Fichier
test3
:Les commandes:
La voie alternative
Comme il n'y a pas de réponse à ce jour pour expliquer comment utiliser l'
-I
option correctement, je fournirai une alternative qui fonctionne dans les shells bash:diff -u
- diff unifié-B
- ignorer les lignes vides<(command)
- une fonctionnalité bash appelée substitution de processus qui ouvre un descripteur de fichier pour la commande, cela évite d'avoir à utiliser un fichier temporairegrep
- commande pour imprimer des lignes (ne) correspondant pas à un motif-v
- montrer les lignes qui ne correspondent pasE
- utiliser des expressions régulières étendues'^\s*(#|$)'
- une expression régulière correspondant aux commentaires et aux lignes vides^
- correspondre au début d'une ligne\s*
- faire correspondre les espaces (tabulations et espaces) le cas échéant(#|$)
correspondre à une marque de hachage, ou bien à la fin d'une lignela source
Essayer:
Notez que l'expression rationnelle doit correspondre à la ligne correspondante dans les deux fichiers et à chaque ligne modifiée dans le bloc pour fonctionner, sinon la différence sera toujours affichée.
Utilisez des guillemets simples pour protéger le motif de l’extension du shell et pour échapper aux caractères réservés aux expressions rationnelles (par exemple, les crochets).
Nous pouvons lire dans le
diffutils
manuel:Ce comportement est également bien expliqué par armel ici .
Connexes: Comment puis-je effectuer un diff qui ignore tous les commentaires?
la source
Après des recherches sur le Web, le meilleur moyen que j'ai trouvé est le Lekensteyn.
Mais je veux utiliser dif output comme patch ... et il y a un problème car les numéros de ligne sont conservés note à cause de "grep -v".
J'ai donc l'intention d'améliorer cette ligne de commande:
Ce n'est pas parfait, mais les numéros de ligne sont conservés dans un fichier de correctif.
Cependant, si une nouvelle ligne est ajoutée à la place d'une ligne de commentaire, le commentaire produira un Hunk FAILED lors de l'application du correctif, comme indiqué ci-dessous.
tester maintenant notre commande
/ dev / fd / 62 et / dev / fd / 63 sont des fichiers produits par substitution de processus. La ligne entre "+ nouvelle ligne" et "-autre texte" est le caractère d'espace par défaut défini dans notre expression sed pour remplacer les commentaires.
Et maintenant, qu'est-ce qui arrive quand on applique ce patch:
La solution est de ne pas utiliser le format diff unifié sans -u
maintenant fichier de travail fichier de correctif (sans garantie de résultat dans le processus diff très complexe).
la source
diff -U0 one two
pour désactiver le contexte. Pour le correctif, il existe de nombreux outils mieux adaptés, tels que kdiff3.-U0
option de désactiver le contexte. Remarque: kdiff3 est un outil graphique. J'ai besoin d'un outil automatique pour gérer les attributs de fusion Git.vimdiff
prend en charge les fusions à trois voies, pourrait être intéressant de regarder.J'ignore généralement ce fouillis de l'une des manières suivantes:
grep -v "^#" | cat -s
et en diff ...vim -d
pour regarder les fichiers. La mise en évidence de la syntaxe permet de rendre évidentes les différences entre commentaires et non-commentaires. La mise en surbrillance de la différence en ligne de sorte que vous puissiez voir quelles valeurs ou parties de valeurs ont été modifiées en un coup d'œil en fait mon préféré.la source
Voici ce que j'utilise pour supprimer toutes les lignes commentées, même celles commençant par une tabulation ou un espace, et les vides:
ou tu peux faire
la source