He leído sobre diff y patch pero no puedo entender cómo aplicar lo que necesito. Supongo que es bastante simple, así que para mostrar mi problema, tome estos dos archivos:
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>
Quiero tener una salida, que se ve así (el orden no importa):
<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>
La fusión debe contener todas las líneas a lo largo de estas reglas simples:
- cualquier línea que solo esté en uno de los archivos
- Si una línea tiene la misma etiqueta de nombre pero un valor diferente, tome el valor de la segunda
Quiero aplicar esta tarea dentro de un script bash, por lo que no necesariamente debe hacerse con diff y patch, si otro programa es mejor
diff
puede decirle qué líneas están en un archivo pero no en el otro, sino solo en la granularidad de líneas enteras.patch
solo es adecuado para realizar los mismos cambios en un archivo similar (tal vez una versión diferente del mismo archivo o un archivo completamente diferente donde, sin embargo, los números de línea y las líneas circundantes para cada cambio son idénticos a su archivo original). Entonces no, no son particularmente adecuados para esta tarea. Es posible que desee echar un vistazo,wdiff
pero la solución probablemente requiera un script personalizado. Dado que sus datos se parecen a XML, es posible que desee buscar alguna herramienta XSL.