Compréhension de la sortie diff

89

j'ai file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

et file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

si je le fais: diff file1.txt file2.txtje reçois:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Comment la sortie est-elle généralement interprétée? Je pense que cela <signifie enlevé mais que faire 3d2ou 5a5dire?

Si je fais:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Les résultats sont plus clairs mais que veut @@ -1,5 +1,5 @@dire?

Jim
la source

Réponses:

98

Dans votre première diffsortie (appelée "normall diff"), la signification est la suivante

< - dénote les lignes dans file1.txt

> - dénote les lignes dans file2.txt

3d2et 5a5indiquent les numéros de ligne affectés et les actions effectuées. dsignifie suppression, asignifie ajouter (et csignifie changer). le numéro à gauche du caractère est le numéro de ligne dans fichier1.txt, le numéro à droite est le numéro de ligne dans fichier2.txt. 3d2Vous indique donc que la 3ème ligne de file1.txt a été supprimée et que le numéro de ligne 2 est dans file2.txt (ou mieux, après la suppression, le compteur de lignes est revenu à la ligne 2). 5a5vous indique que nous avons démarré à partir de la ligne 5 dans fichier1.txt (qui était en fait vide après avoir supprimé une ligne dans l'action précédente), a ajouté la ligne et que cette ligne est le numéro 5 dans fichier2.txt.

La sortie de la diff -ucommande est formatée un peu différemment (format dit "diff unifié"). Ici diffnous montre un seul morceau du texte, au lieu de deux textes séparés. Dans la ligne, @@ -1,5 +1,5 @@la partie se -1,5rapporte à file1.txt et la partie +1,5à file2.txt. Ils nous disent que diffcela montrera un morceau de texte de 5 lignes à partir de la ligne 1 de fichier1.txt. Et la même chose à propos du fichier2.txt - diffnous montre 5 lignes à partir de la ligne 1.

Comme je l'ai déjà dit, les lignes des deux fichiers sont montrées ensemble

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Ici, -les lignes qui ont été supprimées de fichier1.txt et +les lignes qui ont été ajoutées.

John Smith
la source
25

Résumé :

Donné a diff file1 file2, <signifie que la ligne est manquante file2et >signifie que la ligne est manquante file1. Les 3d2et 5a5peuvent être ignorés, ce sont des commandes pour patchlesquelles on utilise souvent diff.

Réponse complète :

De nombreux utilitaires * nix offrent des manuels TeXinfo ainsi que des manpages plus simples . vous pouvez y accéder en exécutant info command, par exemple info diff. Dans ce cas, la section qui vous intéresse est la suivante:

2.4.2 Description détaillée du format normal


Le format de sortie normal consiste en un ou plusieurs blocs de différences; chaque morceau montre une zone où les fichiers diffèrent. Les mecs au format normal ressemblent à ceci:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

Il existe trois types de commandes de changement. Chacune consiste en un numéro de ligne ou une plage de lignes séparées par des virgules dans le premier fichier, un seul caractère indiquant le type de modification à effectuer et un numéro de ligne ou une plage de lignes séparées par des virgules dans le second fichier. Tous les numéros de ligne sont les numéros de ligne d'origine dans chaque fichier. Les types de commandes de changement sont:

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been
terdon
la source
4

Je suggère d'utiliser:

diff -rupP file1.txt file2.txt > result.patch

Ensuite, lorsque vous lirez result.patch, vous saurez instantanément la différence.

Voici les significations des commutateurs de ligne de commande:

-r : récursif

-u : affiche le numéro de ligne

-p (petit): montre les différences dans les fonctions C

-P (majuscule): en cas de fichiers multiples, le chemin complet est affiché

Ravi
la source
3

Les réponses ci-dessus sont bonnes. Cependant, en tant que débutant, je les ai trouvé un peu difficiles à comprendre et après une recherche approfondie, j'ai trouvé un lien très utile: Linux Diff Command & Examples

Le site explique le concept de manière simple et facile à comprendre.

La commande Diff est plus facile à comprendre si vous la considérez comme suit:

Essentiellement, il fournit un ensemble d'instructions sur la façon de modifier un fichier pour le rendre identique au deuxième fichier.

Chacun des cas suivants est bien expliqué:

a pour ajouter, c pour changer, d pour supprimer

userAsh
la source
2

Renommez les choses pour vous aider à vous souvenir!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

Les résultats agissent sur le fichier à éditer (fichier1) en y appliquant diverses mises à jour.


Similitude, je trouve ces renommage utiles pour conceptualiser les résultats:

Supprimer = 'supprimer' & Ajouter = 'insérer'.

2,4d1 --- D (s) - d -N --- d elete (' supprimer ') ligne (s) D. Puis synchronisez à la ligne N dans les deux.

4a2,4 --- N- a -U (s) --- A la ligne N, un dd (' insert ') ligne (s) de mise à jour U

Note: Ils sont presque symétriques.


Change = 'remove & insert'.

2,4c5,6 --- R (s) - c -U (s) --- Supprime les lignes R (s), puis insère les lignes mises à jour U (s) à leur place.



Par exemple:

4a2,4 --- à partir de 4, additionnez les lignes 2 à 4 mises à jour (c'est-à-dire que 2,4 signifie 2, 3 et 4)

2,4d1 --- supprimer les lignes 2-4.

2,4c5,6 --- supprime les lignes 2 à 4 et insère les lignes 5 à 6 mises à jour


  • Je sais que ce sont des commandes d’éditeur de flux conçues pour être traitées par une machine. Par exemple, il s’agit bien de la commande ed add, not insert, mais c’est plus utile pour moi de penser à insert qui est ce qui est finalement fait au fichier. Ils utilisent des opérations de flux, mais j'aime penser en termes de résultats.

Vue elliptique
la source