web-dev-qa-db-fra.com

Compréhension de la sortie diff

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 fais: diff file1.txt file2.txt Je reçois:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Comment la sortie est-elle généralement interprétée? Je pense que < signifie supprimé mais qu'est-ce que 3d2 ou 5a5 signifier?

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 qu'est-ce que @@ -1,5 +1,5 @@ signifier?

106
Jim

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

< - indique les lignes dans file1.txt

> - indique les lignes du fichier2.txt

3d2 Et 5a5 Indiquent les numéros de ligne affectés et les actions qui ont été effectuées. d signifie suppression, a signifie ajout (et c signifie modification). le nombre à gauche du caractère est le numéro de ligne dans file1.txt, le nombre à droite est le numéro de ligne dans file2.txt. Donc 3d2 Vous indique que la 3ème ligne dans file1.txt a été supprimée et a le numéro de ligne 2 dans file2.txt (ou mieux pour dire qu'après la suppression le compteur de lignes est revenu à la ligne numéro 2). 5a5 Vous indique que nous avons commencé à partir de la ligne numéro 5 dans file1.txt (qui était en fait vide après avoir supprimé une ligne dans l'action précédente), ajouté la ligne et cette ligne ajoutée est le numéro 5 dans file2.txt .

La sortie de la commande diff -u Est formatée un peu différemment (ce qu'on appelle le format "diff unifié"). Ici diff nous montre une seule partie du texte, au lieu de deux textes séparés. Dans la ligne @@ -1,5 +1,5 @@, La partie -1,5 Se rapporte à file1.txt et la partie +1,5 À file2.txt. Ils nous disent que diff affichera un morceau de texte de 5 lignes à partir de la ligne numéro 1 dans file1.txt. Et la même chose pour le fichier2.txt - diff nous montre 5 lignes à partir de la ligne 1.

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

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

Ici - Désigne les lignes qui ont été supprimées de file1.txt et + Désigne les lignes qui ont été ajoutées.

113
John Smith

Résumé:

Donné un diff file1 file2, < signifie que la ligne manque dans file2 et > signifie que la ligne manque dans file1. Le 3d2 et 5a5 peut être ignoré, ce sont des commandes pour patch qui sont souvent utilisées avec diff.

Réponse complète:

De nombreux utilitaires * nix proposent des manuels TeXinfo ainsi que des pages man 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:

2.4.2 Description détaillée du format normal


Le format de sortie normal consiste en un ou plusieurs morceaux 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 modification. Chacun se compose d'un numéro de ligne ou d'une plage de lignes séparées par des virgules dans le premier fichier, d'un caractère unique indiquant le type de modification à effectuer et d'un numéro de ligne ou d'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 de chaque fichier. Les types de commandes de modification sont les suivants:

`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
29
terdon

Je suggère d'utiliser:

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

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

Ce sont les significations des commutateurs de ligne de commande:

- r: récursif

-: 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é

5
Ravi

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

Le site explique le concept d'une manière simple et facile à comprendre.

La commande diff est plus facile à comprendre si vous la considérez de cette façon:

Essentiellement, il génère 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

5
userAsh

Renommez les choses pour vous aider à vous souvenir!

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

Les résultats opèrent sur le fichier à éditer (fichier1), en lui appliquant diverses mises à jour.


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

Delete = 'remove' & Add = 'insert'.

2,4d1 --- D (s) -d - N --- d elete ('remove') D line (s) . Synchronisez ensuite à la ligne N dans les deux.

4a2,4 --- N -a - U (s) --- À la ligne N, a dd ('insérer') mises à jour ligne (s) U

Remarque: ils sont presque symétriques.


Change = 'supprimer et insérer'.

2,4c5,6 --- R (s) -c - U (s) --- Supprimer R(s) lignes, puis insérer les lignes mises à jour = U(s) à leur place.



Par exemple:

4a2,4 --- à partir de 4, ajoutez (insérez) les lignes mises à jour 2-4 (c'est-à-dire 2,4 signifie 2, 3 et 4)

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

2,4c5,6 --- supprimer les lignes 2-4 et insérer les lignes 5-6 mises à jour


  • Je sais que ce sont des commandes de l'éditeur de flux et conçues pour être traitées par une machine. Par exemple, c'est vraiment la commande ed ajouter, pas insérer, mais il est plus utile pour moi de penser à insérer qui est ce qui est finalement fait dans le fichier. Ils utilisent des opérations de flux, mais j'aime penser en termes de résultats.

4
Elliptical view