Tôi đã đọc về diff và patch nhưng tôi không thể tìm ra cách áp dụng những gì tôi cần. Tôi đoán nó khá đơn giản, vì vậy để hiển thị vấn đề của tôi, hãy lấy hai tệp này:
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>
bDB
<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>
Tôi muốn có một đầu ra, trông như thế này (thứ tự không thành vấn đề):
<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>
Việc hợp nhất phải chứa tất cả các dòng dọc theo quy tắc đơn giản này:
- bất kỳ dòng nào chỉ có trong một trong các tệp
- nếu một dòng có cùng tên thẻ nhưng có giá trị khác, hãy lấy giá trị từ dòng thứ hai
Tôi muốn áp dụng tác vụ này trong tập lệnh bash, vì vậy nó không nhất thiết phải được thực hiện với diff và patch, nếu một chương trình khác phù hợp hơn
diff
có thể cho bạn biết những dòng nào trong một tệp nhưng không phải là dòng khác, mà chỉ về độ chi tiết của toàn bộ dòng.patch
chỉ phù hợp để thực hiện cùng một thay đổi cho một tệp tương tự (có thể là một phiên bản khác của cùng một tệp hoặc một tệp hoàn toàn khác trong đó số dòng và các dòng xung quanh cho mỗi thay đổi giống hệt với tệp gốc của bạn). Vì vậy, không, chúng không đặc biệt phù hợp cho nhiệm vụ này. Bạn có thể muốn xem quawdiff
nhưng giải pháp có thể yêu cầu một tập lệnh tùy chỉnh. Vì dữ liệu của bạn trông giống như XML, bạn có thể muốn tìm một số công cụ XSL.