Я читал о diff и patch, но не могу понять, как применить то, что мне нужно. Я думаю, это довольно просто, поэтому, чтобы показать мою проблему, возьмите эти два файла:
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>
Я хочу получить вывод, который выглядит следующим образом (порядок не имеет значения):
<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>
Слияние должно содержать все строки по этим простым правилам:
- любая строка, которая есть только в одном из файлов
- если строка имеет тот же тег имени, но другое значение, возьмите значение из второго
Я хочу применить эту задачу в скрипте bash, поэтому она не обязательно должна быть завершена с помощью diff и patch, если другая программа лучше подходит
diff
может сказать вам, какие строки находятся в одном файле, но не в другом, но только по степени детализации целых строк.patch
подходит только для внесения одинаковых изменений в аналогичный файл (возможно, в другую версию того же файла или в совершенно другой файл, где, однако, номера строк и окружающие строки для каждого изменения идентичны вашему исходному файлу). Так что нет, они не особенно подходят для этой задачи. Возможно, вы захотите взглянуть,wdiff
но решение, вероятно, требует специального сценария. Поскольку ваши данные выглядят как XML, вам может понадобиться какой-нибудь инструмент XSL.