Jak dodawać linie tylko za pomocą łatki?


1

Chciałbym móc użyć diff i poprawki, aby zapisać nowe linie do pliku. Aby wyjaśnić, co mam na myśli:

Oryginalny plik: test1.repo

wyklucz = mongo *

exclude = sqlite *

exclude = postgresql *

Nowy plik: test2.repo

wyklucz = mongo *

exclude = postgresql *

wyklucz = mysql *

Więc uruchamiam polecenie, diff -u test1.repo test2.repo > repo.patchaby znaleźć różnice, dość proste. Patrząc na repo.patchwłaśnie utworzony plik, widzę wynik:

wyklucz = mongo *

-exclude = sqlite *

exclude = postgresql *

+ exclude = mysql *

Jeśli użyję tej łatki w takim stanie, zostanie ona nadpisana tym, co faktycznie zawiera tylko dane, które mam test2.repo. Czy istnieje sposób, aby łatka zapisywała tylko nowe wiersze ( cokolwiek zaczynające się od znaku + )? Chciałbym dodać wiersze do oryginalnego repozytorium, ale nie niszczyć żadnych dostosowań, które już zrobili w swoim pliku.


1
Co powiesz na zastąpienie tych linii usuwania w łatce, uruchamiając na niej np. Skrypt sed sed 's/^-\([^-]\{2\}\)/ \1/'?
Jaap Eldering 16.04.13

2
Może działać w tym przykładzie, ale nie powiedzie się dla linii, które faktycznie zaczynają z --jakiegoś powodu. Osobiście po prostu ręcznie edytuję łatkę, aby rozwiązać konflikty.
frostschutz

1
Możesz użyć, cat <(head -n 1 repo.patch) <(grep -ve '^-' repo.patch) | patchaby rozwiązać problem wskazany przez @frostschutz. Ale przy tych zmodyfikowanych plikach łatek pojawia się błąd patch: **** malformed patch at line 9:(to jest EOF), ponieważ musisz także zmodyfikować @@ -1,4 +1,6 @@linie ?!
mpy

Masz rację @mpy, bezpośrednio modyfikując plik łaty w ten sposób, musiałbym również zaktualizować linię odniesienia lokalizacji. Łatwo jest to zrobić ręcznie, ale potrzebuję zautomatyzować cały proces, stąd pierwotne pytanie.
Mono

1
Dla danych wejściowych sort -u test1.repo test2.repomoże również działać.
frostschutz
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.