Comment puis-je obtenir diff pour montrer uniquement les lignes ajoutées et supprimées? Si diff ne peut pas le faire, quel outil le peut?
command-line-interface
diff
Traverser
la source
la source
diff A B | grep '^[<>]'
comm
.Réponses:
Essayez comm
Une autre façon de voir les choses:
Afficher les lignes qui n'existent que dans le fichier a: (c'est-à-dire ce qui a été supprimé de a)
Afficher les lignes qui n'existent que dans le fichier b: (c'est-à-dire ce qui a été ajouté à b)
Afficher les lignes qui n'existent que dans un fichier ou l'autre: (mais pas les deux)
(Avertissement: si le fichier
a
contient des lignes commençant par TAB, il (le premier TAB) sera supprimé de la sortie.)Fichiers triés seulement
REMARQUE: Les deux fichiers doivent être triés pour
comm
fonctionner correctement. S'ils ne sont pas déjà triés, vous devez les trier:Si les fichiers sont extrêmement longs, cela peut s'avérer fastidieux, car il nécessite une copie supplémentaire et par conséquent deux fois plus d'espace disque.
la source
comm -12 <(sort a) <(sort b)
comm
pourrait faire ce que vous voulez. De sa page de manuel:Ces colonnes sont supprimables avec
-1
,-2
et-3
respectivement.Exemple:
Et si vous voulez juste les lignes uniques et ne vous souciez pas du fichier dans lequel elles se trouvent:
Comme le dit la page de manuel, les fichiers doivent être préalablement triés.
la source
Pour afficher les ajouts et les suppressions sans contexte, numéros de ligne, +, -, <,>! etc, vous pouvez utiliser diff comme ceci:
Par exemple, à partir de deux fichiers:
a.txt
b.txt
La commande suivante affichera les lignes supprimées de a ou ajoutées à b:
sortie:
Cette commande légèrement différente montrera les lignes supprimées de a.txt:
sortie:
Enfin, cette commande affichera les lignes ajoutées à a.txt
sortie
la source
C'est ce que diff fait par défaut ... Peut-être avez-vous besoin d'ajouter des drapeaux pour ignorer les espaces?
devrait ignorer les lignes vides et un nombre différent d'espaces.
la source
Non,
diff
ne montre pas réellement les différences entre deux fichiers dans la façon dont on pourrait penser. Il produit une séquence de commandes d'édition pour un outil,patch
à utiliser pour changer un fichier dans un autre.La difficulté pour toute tentative de faire ce que vous cherchez est de savoir comment définir ce qui constitue une ligne modifiée par rapport à une ligne supprimée suivie d’une ligne ajoutée. De plus, que faire lorsque des lignes sont ajoutées, supprimées et modifiées les unes à côté des autres.
la source
diff
sources, mais je me souviens de toutes sortes de gyrations pour garder la trace de la concordance de deux fichiers afin de rester synchronisés et je pense qu’il ya un seuil pour abandonner basé sur la distance qui sépare les fichiers. les lignes sont. Mais je ne me souviens d'aucune correspondance intra-ligne, sauf en ce qui concerne l'espace blanc réduit ou le cas ignoré. Ou (peut-être) des mots à cet effet. Dans tous les cas, il s’agit depatch
"vgrep". Peut être. Mardi.Les outils de comparaison visuelle associent deux fichiers pour qu'un segment comportant le même nombre de lignes mais dont le contenu diffère soit considéré comme un segment modifié. Les nouvelles lignes entre les segments correspondants sont considérées comme des segments ajoutés.
C’est également ainsi que fonctionne l’ outil de ligne de commande sdiff , qui présente une comparaison côte à côte de deux fichiers d’un terminal. Les lignes modifiées sont séparées par | personnage. Si une ligne n'existe que dans le fichier A, <est utilisé comme séparateur. Si une ligne n'existe que dans le fichier B,> est utilisé comme séparateur. Si vous n'avez pas de caractères <et> dans les fichiers, vous pouvez utiliser ceci pour afficher uniquement les lignes ajoutées:
la source
Merci senarvi, votre solution (non votée pour) m'a en fait EXACTEMENT ce que je voulais après avoir cherché des siècles sur une tonne de pages.
En utilisant votre réponse, voici ce que j’ai trouvé pour obtenir la liste des choses modifiées / ajoutées / supprimées. L'exemple utilise 2 versions du fichier / etc / passwd et imprime le nom d'utilisateur pour les enregistrements pertinents.
la source
Je trouve cette forme particulière souvent utile:
Exemple:
Sortie:
Ainsi, il affiche les anciennes lignes
-
suivies immédiatement de la nouvelle ligne correspondante+
.Si nous avions une suppression de
C
:ça ressemble à ça:
Le format est documenté à
man diff
:et:
et:
Question associée: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Testé dans Ubuntu 18.04.
la source
Fichier1:
Fichier2:
Utilisation:
Cette affiche deux colonnes pour les fichiers repectives.
Sortie:
la source