Diff signale la différence mais les deux lignes sont identiques

55

Je diff-ed 2 fichiers et ai

1c1
< 1
---
> 1

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

Jiew Meng
la source
poster le contenu des deux fichiers s'il vous plaît;)
Rinzwind
5
Si vous utilisez diff, l' -uoption est peut-être plus lisible par l'homme.
Lekensteyn
@Rinzwind, les deux fichiers ne contiennent que le texte 1, mais si vous voulez en voir plus, regardez pastebin.com/byiqdie1
Jiew Meng Le
Pardon. Ce n'est pas le cas quand je fais ça. Il doit y avoir quelque chose de différent. Faites un cp 1 2(écrasez-en 2) et vous pouvez être 100% sûr que ce sont les mêmes;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc

Réponses:

68

1ère ligne: asignifie ajouté, dsupprimé et cmodifié. Les numéros de ligne du fichier d'origine apparaissent avant ces lettres et ceux du fichier modifié apparaissent après la lettre.

2ème ligne: les lignes avec <proviennent du fichier 1 et sont différentes du fichier 2.

3ème ligne est un diviseur.

4ème ligne: les lignes avec >proviennent du fichier 2 et sont différentes du fichier 1.

(Si vous voyez jamais =cela signifie que les lignes sont les mêmes dans les deux fichiers)

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

Il y a quelques options pour manipuler la sortie.

Exemple:

rinzwind @ discworld: ~ $ plus 1 
tester
test2
test3
rinzwind @ discworld: ~ $ plus 2
tester
test2  
test3

format contextualisé:

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 ****
  tester
! test2
  test3
--- 1,3 ----
  tester
! test2  
  test3

UNE "!" 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 figurent les informations sur le fichier, y compris le chemin d'accès complet et un horodatage. Au début de chaque bloc, figurent les numéros de ligne correspondant à la modification correspondante dans les fichiers. Une plage de nombres apparaissant entre des ensembles de trois astérisques s'applique au fichier d'origine, tandis que des ensembles de trois tirets s'appliquent au nouveau fichier. Les plages de blocs spécifient les numéros de ligne de début et de fin dans le fichier respectif.

Développer 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 @@
 tester
-test2
+ test2  
 test3

Le format commence par le même en-tête de deux lignes que le format de contexte, sauf que le fichier d'origine est précédé de "---" et le nouveau fichier de "+++". Ensuite, un ou plusieurs éléments de modification contenant les différences de ligne dans le fichier. Les lignes contextuelles inchangées sont précédées d'un caractère d'espacement, les lignes d'addition 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 Ignorer les changements dans la quantité d'espace blanc.

-w Ignorer tous les espaces blancs.

-B Ignorer toutes les lignes vides.

-y sortie en 2 colonnes.

Rinzwind
la source
Comment puis-je vérifier s'il y a des personnages cachés? Est-il possible d'ignorer les caractères cachés (peut-être juste d'exclure les nouvelles lignes et les tabulations?) Je suppose que la plupart des caractères cachés sont accidentels?
Jiew Meng
J'ai mis quelques options utiles (copiées à partir de man diff;))
Rinzwind
Je remarque l'utilisation de l'option -b. Hmm je ne vois pas la différence dans les espaces blancs dans gedit :)
Jiew Meng
@JiewMeng Exécuter od -x1zsur les deux fichiers et comparer les odrésultats. Il devrait trouver toutes les différences cachées entre les fichiers.
Lgarzo
6

Je trouve od (octal dump) très pratique lors de la comparaison de fichiers avec des caractères non imprimables (en particulier les fichiers dont les différences sont «binaires» et qui vous indiquent uniquement qu’ils diffèrent).

Dans l'exemple ci-dessous, je crée une paire de fichiers pouvant ressembler à ceux d'origine, puis effectue un diff avec la sortie d'origine. Ensuite, je diff sur un couple de différentes "od" sorties.

$ 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
Charles Boling
la source
1

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'eux peut être au format DOS / Windows et l'autre au format UNIX

Après que j'ai fait cela, le diff était tout bon!

levk
la source
0

Vous ne savez pas si cela vous aide avec la difficulté de trouver des caractères d'espaces, mais c'est pratique pour les différences: http://www.gnu.org/software/wdiff/

David Winiecki
la source