Różnice zgłaszają różnice, ale obie linie są takie same

55

Zróżnicowałem 2 pliki i dostałem

1c1
< 1
---
> 1

Oba pliki zawierały tylko „1”. Czym się to różni?

Jiew Meng
źródło
opublikuj treść obu plików;)
Rinzwind
5
Jeśli używasz diff, -uopcja może być bardziej czytelna dla człowieka.
Lekensteyn,
@Rinzwind, oba pliki zawierają tylko tekst 1, ale jeśli chcesz zobaczyć więcej, zajrzyj na pastebin.com/byiqdie1
Jiew Meng
Przepraszam. Nie dzieje się tak, kiedy to robię. Musi być coś innego. Zrób cp 1 2( a więc zastąp 2), a wtedy możesz być w 100% pewien, że są takie same;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc

Odpowiedzi:

68

Pierwszy wiersz: aoznacza dodany, dusunięty i czmieniony. Numery wierszy oryginalnego pliku pojawiają się przed tymi literami, a numery zmodyfikowanego pliku pojawiają się po literze.

Druga linia: linia z <pochodzi z pliku 1 i różni się od pliku 2.

Trzecia linia to dzielnik.

4. linia: linia z >pochodzi z pliku 2 i różni się od pliku 1.

(Jeśli kiedykolwiek zobaczysz =, oznacza to, że linie są takie same w obu plikach)

Problemem mogą być białe spacje lub inne znaki, które nie są czytelne dla człowieka: one również powodują różnicę.

Istnieje kilka opcji manipulowania danymi wyjściowymi.

Przykład:

rinzwind @ discworld: ~ $ więcej 1 
test
test2
test3
rinzwind @ discworld: ~ $ więcej 2
test
test2  
test3

format kontekstowy:

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

„!” reprezentuje zmianę między liniami odpowiadającymi w dwóch plikach. „+” Oznacza dodanie linii, a puste miejsce oznacza niezmienioną linię. Na początku łatki znajdują się informacje o pliku, w tym pełna ścieżka i znacznik czasu. Na początku każdego przystojnika są numery linii, które dotyczą odpowiedniej zmiany w plikach. Zakres liczbowy pojawiający się między zestawami trzech gwiazdek dotyczy oryginalnego pliku, a zestawy trzech myślników dotyczy nowego pliku. Zakresy przystawki określają numery linii początkowej i końcowej w odpowiednim pliku.

Rozszerzając komentarz Lekensteyn na temat ujednoliconego formatu:

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

Format zaczyna się od tego samego dwuwierszowego nagłówka, co format kontekstowy, z tym że oryginalny plik poprzedza „---”, a nowy plik poprzedza „+++”. Po tym następuje jeden lub więcej fragmentów zmian, które zawierają różnice linii w pliku. Niezmienione linie kontekstowe poprzedzone są spacją, linie dodatkowe poprzedzone są znakiem plus, a linie usuwania poprzedzone są znakiem minus.

Kilka przydatnych opcji:

-b Zignoruj ​​zmiany w ilości białego pola.

-w Zignoruj ​​wszystkie białe znaki.

-B Zignoruj ​​wszystkie puste linie.

-y wyjście w 2 kolumnach.

Rinzwind
źródło
Jak sprawdzić, czy są jakieś ukryte postacie? Czy w ogóle można zignorować ukryte znaki (może po prostu wyłączając znaki nowej linii i tabulatory?). Myślę, że większość ukrytych znaków jest przypadkowa?
Jiew Meng
man diff
Wstawiłem
Zauważyłem, że użycie flagi -b działa. Hmm, nie widzę różnicy w białych
znakach
@JiewMeng Uruchom od -x1zna obu plikach i porównaj oddane wyjściowe. Powinien znaleźć wszelkie ukryte różnice między plikami.
lgarzo
6

Uważam, że od (ósemkowy zrzut) jest przydatny podczas porównywania plików ze znakami, które nie są drukowalne (szczególnie pliki, które różnią się między sobą, są „binarne”, a tym samym mówi ci tylko, że różnią się).

W poniższym przykładzie tworzę parę plików, które mogą być podobne do oryginalnych, a następnie robię różnicę z oryginalnym wyjściem; następnie różnicuję na kilku różnych wyjściach „od”.

$ 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
źródło
1

miałem ten sam problem i znalazłem rozwiązanie, które może pomóc, użyj polecenia:

dos2unix <file1> <file2>

jeden z nich może być w formacie dos / windows, a drugi w formacie UNIX

po tym, jak to zrobiłem, różnica była dobra!

lewk
źródło
0

Nie jestem pewien, czy to pomaga w trudnych do znalezienia białych znakach, ale jest przydatne do różnicowania: http://www.gnu.org/software/wdiff/

David Winiecki
źródło