Czytałem o diff i łatce, ale nie mogę wymyślić, jak zastosować to, czego potrzebuję. Myślę, że to dość proste, więc aby pokazać mój problem, weź te dwa pliki:
a.xml
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="not_in_b">#AAAAAA</color>
<color name="in_b_but_different_val">#AAAAAA</color>
<color name="not_in_b_too">#AAAAAA</color>
</resources>
b.xml
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="in_b_but_different_val">#BBBBBB</color>
<color name="not_in_a">#AAAAAA</color>
</resources>
Chcę mieć wynik, który wygląda następująco (kolejność nie ma znaczenia):
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="not_in_b">#AAAAAA</color>
<color name="in_b_but_different_val">#BBBBBB</color>
<color name="not_in_b_too">#AAAAAA</color>
<color name="not_in_a">#AAAAAA</color>
</resources>
Scalanie powinno zawierać wszystkie wiersze według tych prostych zasad:
- dowolny wiersz, który znajduje się tylko w jednym z plików
- jeśli wiersz ma tę samą plakietkę, ale inną wartość, należy pobrać wartość z drugiego
Chcę zastosować to zadanie w skrypcie bash, więc nie trzeba go koniecznie wykonywać przy użyciu diff i łatki, jeśli inny program lepiej pasuje
diff
może powiedzieć, które linie są w jednym pliku, ale nie w drugim, ale tylko na ziarnistości całych linii.patch
nadaje się tylko do dokonywania tych samych zmian w podobnym pliku (być może innej wersji tego samego pliku lub zupełnie innym pliku, w którym jednak numery linii i otaczające linie dla każdej zmiany są identyczne z plikiem oryginalnym). Więc nie, nie są szczególnie odpowiednie do tego zadania. Możesz rzucić okiem,wdiff
ale rozwiązanie prawdopodobnie wymaga niestandardowego skryptu. Ponieważ twoje dane wyglądają jak XML, możesz poszukać jakiegoś narzędzia XSL.