Text-Processing
如何使用patch和diff合併兩個文件並自動解決衝突
我已經閱讀了有關差異和更新檔的資訊,但我不知道如何應用我需要的東西。我想它很簡單,所以要顯示我的問題,請使用以下兩個文件:
一個.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
你不需要
patch
這個;它用於提取更改並在沒有文件未更改部分的情況下發送它們。合併文件的兩個版本的工具是
merge
,但正如@vonbrand
所寫,您需要兩個版本不同的“基礎”文件。要在沒有它的情況下進行合併,請diff
像這樣使用:diff -DVERSION1 file1.xml file2.xml > merged.xml
#ifdef
它將包含 C 樣式/#ifndef
“預處理器”命令中的每組更改,如下所示:#ifdef VERSION1 <stuff added to file1.xml> #endif ... #ifndef VERSION1 <stuff added to file2.xml> #endif
如果兩個文件之間的行或區域不同,則會出現“衝突”,如下所示:
#ifndef VERSION1 <version 1> #else /* VERSION1 */ <version 2> #endif /* VERSION1 */
因此,將輸出保存在一個文件中,然後在編輯器中打開它。搜尋出現的任何地方
#else
,並手動解決它們。然後保存文件並執行它grep -v
以擺脫剩餘的#if(n)def
和#endif
行:grep -v '^#if' merged.xml | grep -v '^#endif' > clean.xml
以後保存文件的原始版本。
merge
可以在額外資訊的幫助下為您提供更好的結果。(但要小心:merge
就地編輯其中一個文件,除非您使用-p
. 閱讀手冊)。