56 votes

Diff rapporte la différence mais les deux lignes sont les mêmes

J'ai fait la différence entre deux fichiers et j'ai obtenu

1c1
< 1
---
> 1

Les deux fichiers ne contenaient que "1". En quoi est-ce différent ?

68voto

Rinzwind Points 270388

1ère ligne : a signifie "ajouté", d pour supprimer et c pour avoir changé. Les numéros de ligne du fichier original apparaissent avant ces lettres et ceux du fichier modifié apparaissent après la lettre.

2ème ligne : ligne avec < sont issus du fichier 1 et sont différents du fichier 2.

La troisième ligne est un séparateur.

4ème ligne : ligne avec > sont issus du fichier 2 et sont différents du fichier 1.

(Si vous avez déjà vu = cela signifie que les lignes sont les mêmes dans les deux fichiers)

Et votre problème peut être dû à des espaces blancs ou à d'autres caractères non lisibles par l'homme : ceux-ci font également la différence.

Il existe quelques options pour manipuler la sortie.

Exemple :

rinzwind@discworld:~$ more 1 
test
test2
test3
rinzwind@discworld:~$ more 2
test
test2  
test3

format contextuel :

rinzwind@discworld:~$ diff -c  1 2
\*\*\* 1   2011-08-13 17:05:40.433966684 +0200
--- 2   2011-08-13 17:11:24.369966629 +0200
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\*\*\* 1,3 \*\*\*\*
  test
! test2
  test3
--- 1,3 ----
  test
! test2  
  test3

Un " !" représente un changement entre les lignes qui correspondent dans les deux fichiers. Un "+" représente l'ajout d'une ligne, tandis qu'un espace vide représente une ligne inchangée. Au début du patch se trouvent les informations sur le fichier, y compris le chemin d'accès complet et un horodatage. Au début de chaque morceau se trouvent les numéros de ligne qui s'appliquent à la modification correspondante dans les fichiers. Une plage de numéros apparaissant entre des ensembles de trois astérisques s'applique au fichier d'origine, tandis que les ensembles de trois tirets s'appliquent au nouveau fichier. Les fourchettes de chiffres spécifient les numéros de ligne de début et de fin dans le fichier respectif.

Développant le commentaire de Lekensteyn sur le format unifié :

rinzwind@discworld:~$ diff -u  1 2
--- 1   2011-08-13 17:05:40.433966684 +0200
+++ 2   2011-08-13 17:11:24.369966629 +0200
@@ -1,3 +1,3 @@
 test
-test2
+test2  
 test3

Le format commence par le même en-tête de deux lignes que le format contextuel, sauf que le fichier original est précédé de "---" et le nouveau fichier de "+++". Suivent une ou plusieurs cases de changement qui contiennent les différences de ligne dans le fichier. Les lignes inchangées et contextuelles sont précédées d'un espace, les lignes d'ajout sont précédées d'un signe plus et les lignes de suppression sont précédées d'un signe moins.

Quelques options utiles :

-b Ne tenez pas compte des changements dans la quantité d'espace blanc.

-w Ignorez tous les espaces blancs.

-B Ignorez toutes les lignes vides.

-y dans 2 colonnes.

6voto

tmm1 Points 101

Je trouve od (dump octal) pour être pratique lors de la comparaison de fichiers avec des caractères non imprimables (en particulier les fichiers que diff décide d'être "binaire" et donc vous dit seulement qu'ils sont différents).

Dans l'exemple ci-dessous, je crée une paire de fichiers qui pourraient ressembler aux fichiers originaux, puis je fais un diff avec la sortie originale ; ensuite, je fais un diff sur deux sorties "od" différentes.

$ echo 1 > 1
$ echo "1 " > 2
$ diff 1 2

1c1  
< 1  
- ---  
> 1   

$ od -c 1 > 1.od
$ od -c 2 > 2.od
$ diff 1.od 2.od

1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003

$ od -Ax -c -t x1 1 > 1.od
$ od -Ax -c -t x1 2 > 2.od
$ diff 1.od 2.od

1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003

1voto

levk Points 11

J'ai eu le même problème et j'ai trouvé une solution qui pourrait aider, utilisez la commande :

dos2unix <file1> <file2>

l'un d'entre eux peut être au format dos/Windows et l'autre au format UNIX.

Après avoir fait cela, le différentiel était en bon état !

0voto

David Winiecki Points 101

Je ne suis pas sûr que cela soit utile pour les caractères d'espacement difficiles à trouver, mais c'est pratique pour la comparaison : http://www.gnu.org/software/wdiff/

0voto

Akshar Patel Points 958

http://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html#Detailed-Unified

Le lien ci-dessus fournit une description plus concise et plus claire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X