Text-Processing

如何使用patch和diff合併兩個文件並自動解決衝突

  • April 17, 2020

我已經閱讀了有關差異和更新檔的資訊,但我不知道如何應用我需要的東西。我想它很簡單,所以要顯示我的問題,請使用以下兩個文件:

一個.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>

合併應該包含遵循這個簡單規則的所有行:

  1. 僅在其中一個文件中的任何行
  2. 如果一行具有相同的名稱標籤但值不同,則取第二個的值

我想在 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. 閱讀手冊)。

引用自:https://unix.stackexchange.com/questions/63425