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
diffmoże powiedzieć, które linie są w jednym pliku, ale nie w drugim, ale tylko na ziarnistości całych linii.patchnadaje 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,wdiffale rozwiązanie prawdopodobnie wymaga niestandardowego skryptu. Ponieważ twoje dane wyglądają jak XML, możesz poszukać jakiegoś narzędzia XSL.