J'essaie de comprendre la commande linux diff sur deux fichiers dont les lignes sont juste une permutation l'une de l'autre mais pas capable de bloquer la sortie qu'elle génère. Considérez les trois commandes ci-dessous:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Quelqu'un peut-il expliquer la sortie cryptique ci-dessus de diff.
- Pourquoi n'y a-t-il aucune mention des "oranges" dans la sortie?
- Que signifie
1d0
et2a2
signifie?
Je comprends de cette réponse que:
"<" signifie que la ligne est manquante dans le fichier2 et ">" signifie que la ligne est manquante dans le fichier1
MAIS cela n'explique pas pourquoi les oranges manquent dans la sortie.
oranges
c'est la plus grande partie commune entre les deux fichiers, donc ce que vous obtenez est le moyen le plus court pour exprimer les différences entre les deux.diff -u file1 file2
place. C'est ce qu'on appelle le format "diff unifié". Le format diff d'origine était censé être très compact, mais les différences unifiées sont censées être beaucoup plus lisibles.diff -y file1 file2
Réponses:
Pour comprendre le rapport, n'oubliez pas que
diff
c'est normatif, décrivant les modifications à apporter au premier fichier (file1
) pour le rendre identique au second fichier (file2
).Plus précisément, les
d
au1d0
moyen de supprimer eta
à des2a2
moyens d' ajouter .Ainsi:
1d0
signifie que la ligne 1 doit être supprimée entrefile1
(apples
).0
au1d0
moyen ligne 0 est où ils sont apparus dans le second fichier (file2
) étaient - ils pas été supprimés. Cela signifie que lorsque vous passezfile2
àfile1
(vers l'arrière), ajoutez la ligne 1file1
après la ligne 0file2
.2a2
signifie ajouter la deuxième ligne (oranges
) defile2
à la deuxième ligne defile1
(après la suppression de la première lignefile1
,oranges
basculée sur la ligne 1)la source
0
en1d0
?Considérez ces fichiers:
file1
:file2
:Comment cela
diff
fonctionne, étant donné qu'il est basé sur les commandes:diff
lit le premier bloc de lignes defile1
etfile2
, et essaie de trouver des lignes égales:Maintenant, il sautera toutes les lignes qui sont égales dans les deux fichiers, ce qui est juste
oranges
dans ce cas:Maintenant, trouvez un autre ensemble de lignes similaires et imprimez les différences:
Évitez les lignes similaires
Si possible, recherchez des lignes identiques et imprimez les différences:
Maintenant, si je le fais
diff file1 file2
:Maintenant, il est simple d'expliquer ce que
diff
signifie la sortie:Pour rendre
file1
égal àfile2
:1,2d0
: Supprimer lesd
lignes1-2
de ( )file1
et modifier la ligne0
de enfile2
conséquence3a2
: Ajouter (a
) à la ligne3
defile1
ligne2
defile2
4a4,5
: Ajouter à la ligne4
defile1
lignes4-5
defile2
diff
comparefile1
avec lafile2
ligne par des différences de lignes et se dépose dans la mémoire temporaire. Après avoirfile1
égal àfile2
jusqu'à la première occurrence d'une ligne dansfile1
, qui se produit également dansfile2
, toutes les lignes qui sont égales jusqu'à ce qu'une différence ne soit pas mentionnée, sont souvent indiquées par---
. Dans ce cas, il n'y a qu'une seule ligne similaire, qui estoranges
. Notez que j'ai ditfile1
égal àfile2
, ilfile1
est donc considéré par rapport àfile2
et non l'inverse.La sortie est en relation avec le premier fichier donné, dans ce cas
file1
.la source
apples
se produit aussi bien dans les deux fichiers.oranges
". Faux: Il y a en fait deux lignes, qui sont non seulement similaires , mais absolument identiques . L' un d'eux litoranges
, l'autre litapples
. De plus, votre explication (purement basée sur l'ordre) est en contradiction avec le commentaire de Stéphane sur la question (basé sur la longueur) - qui a raison?Ils sont là:
la source
Le format de sortie standard (ancien) affichera la différence entre les fichiers sans entourer le texte avec les zones où les fichiers diffèrent.
Par exemple:
1d0 <
(supprimer) signifie que les pommes doivent être supprimées de la 1ère ligne defile1
, et2a2 >
(ajouter) signifie que les pommes doivent être ajoutéesfile2
sur la 2ème ligne, afin que les deux fichiers puissent être appariés.La documentation disponible sur
info diff
explique plus en détail:Voir également:
Donc, pour voir les oranges, il faudrait les différencier côte à côte ou en utilisant un contexte unifié.
Par exemple:
la source