Mam dwa pliki, które porównując z diff pokazują, że każda linia się zmieniła. Kiedy porównuję je z diff -w
(ignorując białe znaki), pokazuje kilka minimalnych zmian, których oczekuję.
Oczywiście istnieje pewna różnica między białymi spacjami w każdym pliku, ale nie wiem, czym one są ani jak je znaleźć. Próbowałem edytować pliki, aby upewnić się, że białe znaki są w rzeczywistości znakami spacji (w przeciwieństwie do tabulatorów), ale nie jestem pewien, co jeszcze można zrobić.
Użyłem vim z, :set list on
aby potwierdzić, że na końcu linii nie ma spacji końcowych.
Uważam również, że każdy plik ma terminatory linii Linuxa, ponieważ vim nie pokazywał ^M
końca linii.
linux
diff
whitespace
Romski
źródło
źródło
diff
ale wielu redaktorów i tak domyślnie nie czyni tego miejsca widocznym.vim
użytkownikiem, to czy próbowałeśvimdiff file1 file2
zobaczyć, jakie są różnice?Odpowiedzi:
Dla
vim
użytkowników jest przydatne narzędzie, które pokazuje dokładne różnice między plikami:Spowoduje to umieszczenie każdego pliku w oknach, obok siebie i różnic z podświetlonym kolorem.
Kilka przydatnych poleceń, gdy w
vimdiff
Podczas gdy
vimdiff
niektóre przydatne polecenia to:]c
: przejdź do następnej zmiany[c
: przejdź do poprzedniej zmianyctrl-W ctrl-W
: przejdź do innego oknazo
: otwarte fałdyzc
: zamknij fałdyPrzykład
Oto przykład
vimdiff
Wxterm
porównujących dwie wersjecups
pliku konfiguracyjnego:Widać, że długie odcinki identycznych linii zostały zwinięte. Można je ponownie otworzyć za pomocą
zo
.Schemat kolorów będzie się różnić w zależności od ustawień opcji. W powyższym przykładzie, gdy linia pojawia się w jednym pliku, ale nie w drugim, linia ma ciemnoniebieskie tło. W drugim pliku brakujące linie są oznaczone liniami przerywanymi. Kiedy linia pojawia się w obu plikach, ale ma pewne różnice, niezmienione części linii mają różowe tło, a zmienione części mają czerwone tło.
źródło
W FreeBSD lub w większości systemów Linux można przesyłać dane wyjściowe z pliku diff,
cat -v -e -t
aby pokazać różnice między białymi spacjami.Karty będą wyświetlane jako
^I
, a$
na końcu każdej linii, aby można było zobaczyć końcowe białe znaki, a znaki niedrukowalne będą wyświetlane jako^X
lubM-X
.Jeśli masz jądra GNU (dostępne w większości dystrybucji Linuksa, które nie są zajęte), można to uprościć
W systemach busybox użyj
catv -vet
.źródło
Czy jeden z plików był edytowany na komputerze z systemem Windows?
Standardowym zakończeniem linii w systemie Windows jest CRLF, gdzie w Linuksie jest to po prostu LF (a na komputerach Mac był to CR, ale podejrzewam, że zmieniło się to od OS X).
Wypróbuj
wc -l
pliki i sprawdź, ile wierszy, a następnie sprawdź, czy różnica wielkości jest taka sama jak liczba wierszy (ostatni wiersz może nie zostać zakończony w jednym pliku).źródło
od
może pomóc. Polecenie Octal Dump może wyświetlać zawartość w systemie szesnastkowym. Pomoże to zobaczyć, jakie bajty, w tym bajty zerowe lub nieoczekiwane białe znaki, znajdują się w pliku. Możliwe typowe przyczyny to LF vs CRLF, tabulatory vs spacje lub ASCII vs Unicode (które często mogą mieć po prostu bajt zerowy przed każdym normalnie widocznym bajtem).od -x filename
powinien ujawnić dowolny z tych wzorów. Jeśli chcesz bardziej skomplikowanego sposobu przeglądania pliku, każdy „edytor szesnastkowy” może zrobić to dobrze. Zaletąod
jest to, że podobnie jakcut
polecenie, jest wbudowany w wiele systemów uniksowych. Dlatego często nie jest wymagana osobna instalacja.Jeśli potrzebujesz bardziej podobnych plików,
tr
możesz wprowadzić zmiany ised
więcej. Najprawdopodobniej zacznę odls -l
sprawdzenia, który plik jest większy, a następnie od wyświetlenia bajtów, aby zobaczyć, co należy zmienić, a następnie zmień jeden z plików, aby wyglądały bardziej podobnie.źródło
Aby dowiedzieć się, gdzie są prawdziwe białe znaki i tabulatory, możesz je zastąpić,
sed
na przykład:A teraz porównaj dwa pliki.
źródło
cat
, jak w superuser.com/a/913368/37154Poniższa treść została skopiowana tutaj z sekcji „pytanie” powyżej, napisanej przez Romskiego.
Zarówno
vimdiff
idiff file1 file2 | cat -A
były bardzo przydatne z punktu widzenia narzędzi.Wreszcie znalazłem jeszcze jeden problem. Niektóre z moich plików zostały zakodowane przy pomocy UTF-8 BOM. Zostało to podkreślone za pomocą
diff file1 file2 | cat -A
. Przejawiało się toM-oM-;M-?
na początku pliku, którego dotyczy problem:Chociaż było wiele problemów, wymieniłem poniżej kilka poleceń dla tych, którzy muszą wyczyścić swoje pliki:
źródło