Zrozumienie wyjścia różnicowego


87

mam file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

i file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

jeśli to zrobię: diff file1.txt file2.txtdostanę:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Jak ogólnie interpretowana jest produkcja? Myślę, że <to oznacza usunięte, ale co to znaczy 3d2lub co 5a5oznacza?

Jeśli zrobię:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Wyniki są wyraźniejsze, ale co to @@ -1,5 +1,5 @@znaczy?

Odpowiedzi:


96

W pierwszym diffwyjściu (tak zwanym „normall diff”) znaczenie jest następujące

< - oznacza linie w pliku1.txt

> - oznacza linie w pliku2.txt

3d2i 5a5oznaczają numery linii, których to dotyczy, i które działania zostały wykonane. doznacza usunięcie, aoznacza dodanie (i coznacza zmianę). liczba po lewej stronie znaku to numer linii w pliku1.txt, liczba po prawej to numer linii w pliku2.txt. 3d2Mówi więc , że trzecia linia w pliku1.txt została usunięta i ma linię 2 w pliku2.txt (lub lepiej powiedzieć, że po usunięciu licznik linii wrócił do linii nr 2). 5a5mówi, że zaczęliśmy od linii nr 5 w pliku1.txt (która była faktycznie pusta po usunięciu linii w poprzedniej akcji), dodaliśmy linię i ta dodana linia to liczba 5 w pliku2.txt.

Wyjście diff -upolecenia jest sformatowane nieco inaczej (tak zwany format „unified diff”). Tutaj diffpokazuje nam pojedynczy fragment tekstu zamiast dwóch oddzielnych tekstów. W linii @@ -1,5 +1,5 @@część -1,5odnosi się do pliku1.txt, a część +1,5do pliku2.txt. Mówią nam, że diffpokaże fragment tekstu o długości 5 linii, zaczynając od linii 1 w pliku1.txt. To samo dotyczy pliku2.txt - diffpokazuje nam 5 linii, zaczynając od linii 1.

Jak już powiedziałem, linie z obu plików są wyświetlane razem

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Tutaj -oznacza linie, które zostały usunięte z pliku1.txt i +oznacza linie, które zostały dodane.


25

Podsumowanie :

Biorąc pod uwagę a diff file1 file2, <oznacza brak linii file2i >oznacza brak linii file1. 3d2I 5a5mogą być ignorowane, są komendy dla patchktórych często jest stosowane z diff.

Pełna odpowiedź :

Wiele narzędzi * nix oferuje podręczniki TeXinfo, a także prostsze manstrony. możesz uzyskać do nich dostęp info command, na przykład uruchamiając info diff. W takim przypadku interesująca Cię sekcja to:

2.4.2 Szczegółowy opis formatu normalnego


Normalny format wyjściowy składa się z jednego lub więcej fragmentów różnic; każdy przystojniak pokazuje jeden obszar, w którym różnią się pliki. Kawałki normalnego formatu wyglądają tak:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

Istnieją trzy rodzaje poleceń zmiany. Każdy składa się z numeru linii lub zakresu linii oddzielonych przecinkami w pierwszym pliku, pojedynczego znaku wskazującego rodzaj zmiany, którą należy wprowadzić, oraz numeru linii lub zakresu oddzielonego przecinkami linii w drugim pliku. Wszystkie numery linii są oryginalnymi numerami linii w każdym pliku. Rodzaje poleceń zmiany są następujące:

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been

4

Proponuję użyć:

diff -rupP file1.txt file2.txt > result.patch

Następnie, kiedy czytasz result.patch, natychmiast poznasz różnicę.

Oto znaczenie przełączników wiersza poleceń:

-r : rekurencyjny

-u : pokazuje numer linii

-p (mały): pokazuje różnice w funkcjach C.

-P (kapitał): w przypadku wielu plików wyświetlana jest pełna ścieżka


3

Powyższe odpowiedzi są dobre. Jednak jako początkujący uznałem je za nieco trudne do zrozumienia, a po dalszych poszukiwaniach znalazłem bardzo przydatny link: Linux Diff Command & Examples

Witryna wyjaśnia tę koncepcję w prosty i łatwy do zrozumienia sposób.

Polecenie różnicowe jest łatwiejsze do zrozumienia, jeśli weźmiesz to pod uwagę w następujący sposób:

Zasadniczo wyświetla zestaw instrukcji dotyczących zmiany jednego pliku, aby był identyczny z drugim plikiem.

Każdy z poniższych przypadków jest dobrze wyjaśniony:

a dla dodania, c dla zmiany, d dla usunięcia


2

Zmień nazwę rzeczy, aby pomóc Ci zapamiętać!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

Wyniki działają na pliku do edycji (plik1), stosując różne aktualizacje.


Podobieństwa uważam, że te nazwy są pomocne w konceptualizacji wyników:

Usuń = „usuń” i dodaj = „wstaw”.

2,4d1 --- D (s) - d -N --- d elete (' remove ') D line (s). Następnie zsynchronizuj w linii N w obu.

4a2,4 --- N -U (e) --- W linii N, a dd ( ' wkładki ') linii zaktualizowanej wersji (S) U

Uwaga: są prawie symetryczne.


Zmień = „usuń i wstaw”.

2,4c5,6 --- R (s) - c -U (s) --- Usuń linie R (s), a następnie wstaw na ich miejsce zaktualizowane linie U (s).



Na przykład:

4a2,4 --- zaczynając od 4, dodaj zaktualizowane linie 2-4 (tj. 2,4 oznacza 2, 3 i 4)

2,4d1 --- usuń linie 2-4.

2,4c5,6 --- usuń wiersze 2-4 i wstaw zaktualizowane wiersze 5-6


  • Wiem, że są to polecenia edytora strumieniowego i zostały zaprojektowane do przetwarzania przez maszynę. Na przykład tak naprawdę jest to polecenie ed add, a nie insert, ale bardziej pomocne jest zastanowienie się nad wstawieniem, które w końcu jest robione do pliku. Używają operacji strumieniowych, ale lubię myśleć o wynikach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.