Jak mogę wyświetlić różnicę, aby wyświetlać tylko dodane i usunięte linie? Jeśli diff nie może tego zrobić, jakie narzędzie może?
command-line-interface
diff
Krzyż
źródło
źródło
diff A B | grep '^[<>]'
comm
.Odpowiedzi:
Spróbuj nawiązać połączenie
Inny sposób na to spojrzeć:
Pokaż linie, które istnieją tylko w pliku a: (tzn. Co zostało usunięte z a)
Pokaż linie, które istnieją tylko w pliku b: (tj. Co zostało dodane do b)
Pokaż linie, które istnieją tylko w jednym lub drugim pliku: (ale nie w obu)
(Ostrzeżenie: jeśli plik
a
ma wiersze rozpoczynające się od TAB, to (pierwsza TAB) zostanie usunięty z wyniku).Tylko posortowane pliki
UWAGA: Aby pliki
comm
działały poprawnie, oba pliki muszą zostać posortowane . Jeśli nie są jeszcze posortowane, należy je posortować:Jeśli pliki są bardzo długie, może to stanowić duże obciążenie, ponieważ wymaga dodatkowej kopii, a zatem dwa razy więcej miejsca na dysku.
źródło
comm -12 <(sort a) <(sort b)
comm
może zrobić co chcesz. Ze strony podręcznika:Te kolumny są suppressable z
-1
,-2
i-3
odpowiednio.Przykład:
A jeśli chcesz tylko unikatowych linii i nie obchodzi Cię, w którym pliku się znajdują:
Jak mówi strona podręcznika, pliki muszą zostać wcześniej posortowane.
źródło
Aby wyświetlić uzupełnienia i usunięcia bez kontekstu, numery linii, +, -, <,>! itp., możesz użyć diff w następujący sposób:
Na przykład, biorąc pod uwagę dwa pliki:
a.txt
b.txt
Następujące polecenie pokaże wiersze usunięte z a lub dodane do b:
wynik:
To nieco inne polecenie pokaże linie usunięte z a.txt:
wynik:
Na koniec to polecenie wyświetli wiersze dodane do pliku a.txt
wynik
źródło
To właśnie diff domyślnie robi ... Może trzeba dodać kilka flag, aby zignorować białe znaki?
powinny ignorować puste linie i inną liczbę spacji.
źródło
Nie,
diff
tak naprawdę nie pokazuje różnic między dwoma plikami w sposób, w jaki można by pomyśleć. Tworzy sekwencję poleceń edycyjnych dla narzędzia takiego jak narzędziepatch
do zmiany jednego pliku na inny.Trudność każdej próby zrobienia tego, czego szukasz, polega na tym, jak zdefiniować, co stanowi linię, która zmieniła się w porównaniu do linii usuniętej, po której następuje linia dodana. Co również zrobić, gdy wiersze są dodawane, usuwane i zmieniane obok siebie.
źródło
diff
źródła, ale wydaje mi się, że pamiętam wszystkie rodzaje zawirowań, aby śledzić, gdzie dwa pliki pasują do siebie w synchronizacji i myślę, że istnieje próg rezygnacji na podstawie tego, jak daleko od siebie są linie są. Ale nie pamiętam żadnego dopasowania wewnątrz linii, z wyjątkiem (opcjonalnie) zwiniętej białej spacji lub ignorowania wielkości liter. Lub (być może) słowa na to wpływają. W każdym razie chodzi o topatch
i „vgrep” pojawia się na przejażdżkę. Może. We wtorek.Narzędzia porównywania wizualnego pasują do siebie dwa pliki, dzięki czemu segment o tej samej liczbie linii, ale o różnej zawartości będzie uważany za zmieniony segment. Całkowicie nowe linie między pasującymi segmentami są uważane za segmenty dodane.
Tak działa również narzędzie wiersza polecenia sdiff , które pokazuje porównanie dwóch plików w terminalu. Zmienione linie są oddzielone | postać. Jeśli wiersz istnieje tylko w pliku A, <jest stosowany jako znak separatora. Jeśli linia istnieje tylko w pliku B,> jest używany jako separator. Jeśli nie masz w plikach znaków <i>, możesz użyć tego, aby wyświetlić tylko dodane linie:
źródło
Dzięki senarvi, twoje rozwiązanie (nie głosowałem) faktycznie dało mi DOKŁADNIE to, czego chciałem po szukaniu wieku na mnóstwie stron.
Korzystając z twojej odpowiedzi, oto, co wymyśliłem, aby uzyskać listę rzeczy zmienionych / dodanych / usuniętych. W przykładzie użyto 2 wersji pliku / etc / passwd i wypisano nazwę użytkownika dla odpowiednich rekordów.
źródło
Uważam, że ta konkretna forma jest często przydatna:
Przykład:
Wynik:
Pokazuje więc stare linie,
-
po których następuje bezpośrednio nowa linia z+
.Gdybyśmy usunęli
C
:To wygląda tak:
Format jest udokumentowany na
man diff
:i:
i:
Powiązane pytanie: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Testowane w Ubuntu 18.04.
źródło
Plik 1:
Plik2:
Posługiwać się:
To pokazuje dwie kolumny dla plików powtórzeń.
Wynik:
źródło