patchとdiffを使用して2つのファイルをマージし、自動的に競合を解決する方法

patchとdiffを使用して2つのファイルをマージし、自動的に競合を解決する方法

違いとパッチについて読みましたが、必要なものを適用する方法がわかりません。私はそれが非常に簡単になりたいので、私の問題を示すために、次の2つのファイルを使用してください。

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. 1行に同じ名前タグがあるが値が異なる場合は、2行目から値を取得します。

これをbashスクリプトに適用したいので、他のプログラムがより適切な場合は、diffとパッチを使用して必ずしも行う必要はありません。

ベストアンサー1

これは必要ありませんpatch。変更を抽出し、ファイルの未変更部分なしで送信するために使用されます。

2つのバージョンのファイルをマージするためのツールがありますが、作成されたmergeように@vonbrand2つのバージョンを分岐するには「デフォルト」ファイルが必要です。なしでマージするには、diff次のように使用します。

diff -DVERSION1 file1.xml file2.xml > merged.xml

#ifdef#ifndefこれには、次のCスタイル/「プリプロセッサ」コマンドのすべての変更セットが含まれます。

#ifdef VERSION1
<stuff added to file1.xml>
#endif
...
#ifndef VERSION1
<stuff added to file2.xml>
#endif

2つのファイルの行または領域が異なる場合、次のような「衝突」が発生します。

#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を使用しない限り、これらのファイルの1つを内部で編集してください-p。マニュアルをお読みください)。

おすすめ記事