Mam dwa pliki konfiguracyjne, oryginalny od menedżera pakietów i dostosowany przeze mnie. Dodałem kilka komentarzy opisujących zachowanie.
Jak mogę uruchomić diff
pliki konfiguracyjne, pomijając komentarze? Skomentowany wiersz jest definiowany przez:
- opcjonalne wiodące białe znaki (tabulatory i spacje)
- znak skrótu (
#
) - cokolwiek innego
Najprostszym wyrażeniem regularnym byłoby pominięcie pierwszego wymagania #.*
. Próbowałem --ignore-matching-lines=RE
( -I RE
) opcji GNU diff 3.0, ale nie mogłem uzyskać pracy z tym RE. Próbowałem też .*#.*
i .*\#.*
bez powodzenia. Dosłowne umieszczenie line ( Port 631
) jako RE
nic nie pasuje, ani nie pomaga umieszczać RE między ukośnikami.
Jak sugeruje to w „diff” smak wyrażenia regularnego wydaje się brakować? , Próbowałem grep -G
:
grep -G '#.*' file
To wydaje się pasować do komentarzy, ale nie działa diff -I '#.*' file1 file2
.
Jak więc korzystać z tej opcji? Jak mogę diff
pominąć niektóre wiersze (w moim przypadku komentarze)? Proszę nie sugerować grep
pliku i porównywać plików tymczasowych.
źródło
-I
opcja powoduje, że blok jest ignorowany tylko wtedy, gdy wszystkie jego wiersze są zgodne z wyrażeniem regularnym. Możesz więc w ten sposób zignorować zmianę tylko do komentowania, ale nie zmiany do komentowania, które są zbliżone do zmiany bez komentowania.diff -I
nie zachowuje się tak, jak się spodziewałem. Zaktualizowałem swoją odpowiedź przykładem, który wyjaśnił mi to zachowanie.Odpowiedzi:
Według Gillesa
-I
opcja ignoruje linię tylko wtedy, gdy nic poza tym zestawem nie pasuje, z wyjątkiem dopasowania-I
. Nie w pełni go zrozumiałem, dopóki go nie przetestowałem.Test
W mój test biorą udział trzy pliki:
Plik
test1
:Plik
test2
:Plik
test3
:Polecenia:
Alternatywny sposób
Ponieważ do tej pory nie ma odpowiedzi wyjaśniającej, jak
-I
prawidłowo korzystać z tej opcji, przedstawię alternatywę, która działa w powłokach bash:diff -u
- zunifikowany diff-B
- zignoruj puste linie<(command)
- funkcja bash zwana podstawieniem procesu, która otwiera deskryptor pliku dla polecenia, eliminuje to potrzebę pliku tymczasowegogrep
- polecenie drukowania linii (nie) pasujących do wzoru-v
- pokaż niepasujące linieE
- używaj rozszerzonych wyrażeń regularnych'^\s*(#|$)'
- wyrażenie regularne pasujące do komentarzy i pustych linii^
- dopasuj początek linii\s*
- dopasuj białe znaki (tabulatory i spacje), jeśli występują(#|$)
dopasuj znak krzyżyka lub alternatywnie koniec liniiźródło
Próbować:
Pamiętaj, że regex musi pasować do odpowiedniej linii w obu plikach i pasuje do każdej zmienionej linii w przystojniaku, aby działać, w przeciwnym razie nadal będzie wyświetlać różnicę.
Używaj pojedynczych cudzysłowów, aby zabezpieczyć wzór przed rozszerzaniem powłoki i uniknąć znaków zarezerwowanych dla wyrażenia regularnego (np. Nawiasów).
Możemy przeczytać w
diffutils
instrukcji:Zachowanie to jest również dobrze wyjaśnione przez Armel .
Powiązane: Jak mogę wykonać różnicę, która ignoruje wszystkie komentarze?
źródło
Po przeszukaniu sieci, alternatywny sposób Lekensteyn jest lepszy.
Ale chcę użyć wyjścia dif jako łaty ... i jest problem, ponieważ numery wierszy są przechowywane z powodu "grep -v".
Dlatego zamierzam ulepszyć ten wiersz poleceń:
Nie jest idealny, ale numer linii jest przechowywany w pliku łatki.
Jeśli jednak zostanie dodany nowy wiersz zamiast wiersza komentarza ... komentarz spowoduje wygenerowanie przystawki FAILED podczas poprawiania, jak widać poniżej.
przetestuj teraz nasze polecenie
/ dev / fd / 62 i / dev / fd / 63 to pliki tworzone przez podstawienie procesu. Linia między „+ nową linią” a „-innym tekstem” jest domyślnym znakiem spacji zdefiniowanym w naszym wyrażeniu sed w celu zastąpienia komentarzy.
A teraz, co nadchodzi, kiedy zastosujemy tę łatkę:
Rozwiązaniem jest nie używać ujednoliconego formatu różnic bez -u
teraz popraw plik roboczy pliku (bez gwarancji wyniku w bardzo złożonym procesie różnicowym).
źródło
diff -U0 one two
aby wyłączyć kontekst. Do łatania jest kilka narzędzi, które mogą być bardziej odpowiednie, takich jak kdiff3.-U0
opcję wyłączenia kontekstu. Uwaga: kdiff3 to narzędzie graficzne. Potrzebuję automatycznego narzędzia do zarządzania atrybutami scalania git.vimdiff
obsługuje połączenia trójstronne, być może warto się przyjrzeć.Zwykle ignoruję ten bałagan przez:
grep -v "^#" | cat -s
i różnicowanie tych lub ...vim -d
do przeglądania plików. Podświetlanie składni powoduje, że różnice między komentarzem a nie-komentarzem są dość oczywiste. Różnicowanie różnic w linii, dzięki czemu można zobaczyć, które wartości lub części wartości zostały zmienione na pierwszy rzut oka, sprawia, że jest to moja ulubiona.źródło
Oto, czego używam, aby usunąć wszystkie skomentowane linie - nawet te zaczynające się tabulatorem lub spacją - i puste:
lub możesz zrobić
źródło