Próbuję zrozumieć polecenie linux diff na dwóch plikach, których linie są po prostu wzajemną permutacją, ale nie są w stanie odczytać generowanych danych wyjściowych. Rozważ trzy poniższe polecenia:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Czy ktoś może wyjaśnić powyższe tajemnicze wyjście z diff.
- Dlaczego w ogóle nie ma wzmianki o „pomarańczach” na wyjściu?
- Co znaczy
1d0
i co2a2
oznacza?
Rozumiem z tej odpowiedzi, że:
„<” oznacza brak wiersza w pliku2, a „>” oznacza brak wiersza w pliku1
ALE to nie wyjaśnia, dlaczego brakuje pomarańczy na wyjściu.
oranges
jest to największa wspólna część między dwoma plikami, więc otrzymujesz najkrótszy sposób na wyrażenie różnic między tymi dwoma plikami.diff -u file1 file2
zamiast tego. Nazywa się to formatem „Unified Diff”. Oryginalny format różnic miał być bardzo kompaktowy, ale zunifikowane różnice mają być znacznie bardziej czytelne.diff -y file1 file2
Odpowiedzi:
Aby zrozumieć raport, pamiętaj, że
diff
ma on charakter nakazowy i opisuje, jakie zmiany należy wprowadzić w pierwszym pliku (file1
), aby był taki sam jak w drugim pliku (file2
).W szczególności
d
in1d0
oznacza usunięcie, aa
in2a2
oznacza dodanie .A zatem:
1d0
oznacza, że wiersz 1 należy usunąć wfile1
(apples
).0
w1d0
drodze linia 0, gdzie będą pojawiały się w drugim pliku (file2
), gdyby nie został usunięty. Oznacza to, że przy zmianiefile2
nafile1
(wstecz) dołącz wiersz 1file1
po wierszu 0 zfile2
.2a2
oznacza dołączenie drugiej linii (oranges
)file2
do teraz drugiej liniifile1
(po usunięciu pierwszej liniifile1
,oranges
przełączony na linię 1)źródło
0
w1d0
środkuRozważ te pliki:
file1
:file2
:Jak to
diff
działa, pod warunkiem, że jest oparte na zamówieniu:diff
odczytuje pierwszy blok liniifile1
ifile2
, i próbuje znaleźć równe linie:Teraz pominie wszystkie wiersze, które są równe w obu plikach, co jest właśnie
oranges
w tym przypadku:Teraz znajdź kolejny zestaw podobnych linii i wydrukuj różnice:
Pomiń podobne linie
Znajdź identyczne linie, jeśli to możliwe, i drukuj różnice:
Teraz, jeśli to zrobię
diff file1 file2
:Teraz łatwo jest wyjaśnić, co
diff
oznacza wynik:Aby
file1
wyrównaćfile2
:1,2d0
: Usuwanie (d
) linii1-2
zfile1
i modyfikacji linii0
zfile2
odpowiednio3a2
: Dołącz (a
) linii3
wfile1
linii2
zfile2
4a4,5
: Dołącz do linii4
odfile1
linii4-5
zfile2
diff
porównujefile1
zfile2
linią po linii i wyrównuje różnice w pamięci tymczasowej. Pofile1
wyrównywaniu dofile2
pierwszego wystąpienia linii wfile1
, która również występuje wfile2
, wszystkie linie, które są równe aż do różnicy, nie są wymienione, często oznaczane jako---
. W tym przypadku istnieje tylko jedna podobna linia, którą jestoranges
. Zauważ, że powiedziałemfile1
równyfile2
, więcfile1
jest postrzegany względem,file2
a nie na odwrót.W tym przypadku dane wyjściowe odnoszą się do pierwszego podanego pliku
file1
.źródło
apples
występuje również w obu plikach.oranges
”. Źle: Istnieją dwie linie, które są nie tylko podobne , ale absolutnie identyczne . Jeden z nich czytaoranges
, drugi czytaapples
. Również twoje wyjaśnienie (oparte wyłącznie na zamówieniu) jest sprzeczne z komentarzem Stéphane'a do pytania (opartym na długości) - kto ma rację?Oto one:
źródło
Standardowy (stary) format wyjściowy wyświetla różnicę między plikami bez otaczającego tekstu z obszarami, w których pliki się różnią.
Na przykład:
1d0 <
(usuń) oznacza, że jabłka muszą zostać usunięte z 1. wierszafile1
, a2a2 >
(dołącz) oznacza, że jabłka należy dodać dofile2
2. wiersza, aby oba pliki można było dopasować.Dokumentacja dostępna na stronie
info diff
wyjaśnia to dalej:Zobacz też:
Aby zobaczyć pomarańcze, musisz różnicować je obok siebie lub za pomocą ujednoliconego kontekstu.
W przykładzie:
źródło