Diff riporta la differenza ma entrambe le righe sono uguali


55

Ho diffeduto 2 file e ottenuto

1c1
< 1
---
> 1

Entrambi i file contenevano solo "1". Come è diverso?


pubblica il contenuto di entrambi i file per favore;)
Rinzwind

5
Se stai usando diff, l' -uopzione potrebbe essere più leggibile dall'uomo.
Lekensteyn,

@Rinzwind, entrambi i file contengono solo il testo 1, ma se vuoi vedere di più guarda pastebin.com/byiqdie1
Jiew Meng

Scusate. Non quando lo faccio. Ci deve essere qualcosa di diverso. Fai un cp 1 2(quindi sovrascrivi 2) e poi puoi essere sicuro al 100% che siano uguali;)
Rinzwind

2
vimdiff file1 file2? : D
dylnmc,

Risposte:


68

1a riga: aindica l'aggiunta, l' deliminazione e la cmodifica. I numeri di riga del file originale vengono visualizzati prima di queste lettere e quelli del file modificato vengono visualizzati dopo la lettera.

2a riga: le righe con <provengono dal file 1 e sono diverse dal file 2.

La terza riga è un divisore.

4a riga: le righe con >provengono dal file 2 e sono diverse dal file 1.

(Se mai lo vedi =significa che le linee sono uguali in entrambi i file)

E il tuo problema potrebbe essere rappresentato da spazi bianchi o altri caratteri leggibili non umani: anche questi innescano una differenza.

Ci sono alcune opzioni per manipolare l'output.

Esempio:

rinzwind @ discworld: ~ $ di più 1 
test
test2
test3
rinzwind @ discworld: ~ $ di più 2
test
test2  
test3

formato contestuale:

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 "!" rappresenta un cambiamento tra le righe che corrispondono nei due file. Un "+" rappresenta l'aggiunta di una linea, mentre uno spazio vuoto rappresenta una linea invariata. All'inizio della patch ci sono le informazioni sul file, incluso il percorso completo e un timestamp. All'inizio di ogni blocco ci sono i numeri di riga che si applicano per la modifica corrispondente nei file. Un intervallo di numeri che appare tra gruppi di tre asterischi si applica al file originale, mentre i gruppi di tre trattini si applicano al nuovo file. Gli intervalli di hunk specificano i numeri di riga iniziale e finale nel rispettivo file.

Espandendo il commento di Lekensteyn sul formato unificato:

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

Il formato inizia con la stessa intestazione a due righe del formato di contesto, tranne per il fatto che il file originale è preceduto da "---" e il nuovo file è preceduto da "+++". Di seguito sono riportati uno o più hunk di modifica che contengono le differenze di riga nel file. Le linee contestuali invariate sono precedute da un carattere spazio, le linee di addizione sono precedute da un segno più e le linee di cancellazione sono precedute da un segno meno.

Alcune opzioni utili:

-b Ignora i cambiamenti nella quantità di spazio bianco.

-w Ignora tutto lo spazio bianco.

-B Ignora tutte le righe vuote.

-y uscita in 2 colonne.


Come posso verificare se ci sono personaggi nascosti? Esiste un modo per ignorare i caratteri nascosti (forse escludendo solo le nuove righe e le schede?) Suppongo che la maggior parte dei personaggi nascosti siano accidentali?
Jiew Meng

Ho inserito alcune opzioni utili (copiate da man diff;))
Rinzwind

Ho notato che usando il flag -b funziona. Hmm, non vedo la differenza nello spazio bianco in gedit :)
Jiew Meng

@JiewMeng Esegui od -x1zsu entrambi i file e confronta l' odoutput. Dovrebbe trovare eventuali differenze nascoste tra i file.
Lgarzo,

6

Trovo od (dump ottale) di essere utile quando si confrontano file con caratteri non stampabili (in particolare i file che diff decide sono "binari" e quindi ti dice solo che differiscono).

Nell'esempio seguente, creo una coppia di file che potrebbero essere come quelli originali, quindi faccio una diff con l'output originale; poi faccio diff su un paio di uscite "od" diverse.

$ 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

1

ho avuto lo stesso problema e ho trovato una soluzione che potrebbe aiutare, utilizzare il comando:

dos2unix <file1> <file2>

uno potrebbe essere in formato DOS / Windows e l'altro in formato UNIX

dopo che l'ho fatto, il diff è andato tutto bene!



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.