Diff + patch - Sum而不是replace

时间:2011-06-19 21:37:45

标签: bash diff patch

说我有一个文件A,其中包含:

  

a = 5

文件B,像这样:

  

b = 5

现在,很明显diff会产生类似这样的东西(补丁):

  

1C1

     

< a = 5

     

---

     

> b = 5

修补文件A显然会将其内容替换为文件B的内容,从而导致文件A包含

  

b = 5

然而,我想要做的是与众不同。我希望合并文件A和B的内容,以便在修补文件A后它将包含

  

a = 5

     

b = 5

我的情况如果课程方式比我的例子更复杂,但我想我已经弄明白了,除了最后的总结性差异/补丁。

tl; dr:我希望diff / patch能够求和,而不是替换文件中的差异。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

您不想修补某些文件,而是尝试合并它们。有很多工具可以帮助你,例如看看kdiff

修改: 更多工具:

  • MELD
  • gPyFm
  • 的diff3
  • tkdiff
  • P4Merge

至少vim -d将完成这项工作; - )

答案 1 :(得分:0)

你很少谈论你想要解决的问题(或者你过多地谈论你采取的方法是如何工作的)。更有趣的是你想​​要做什么。

也许你可以完成

sort -u A B

因为它会根据您提供的输入提供所需的输出。

答案 2 :(得分:0)

来自GNU diffutils包的diff命令提供了通过插入#ifdef预处理器指令来合并两个不同文件的选项。例如,考虑2个文件f1f2(并排显示):

line 1     |   line 1
line 2     |   line 2
line 3a    |   line 3a
line 4     |   line 4
line 5a    |   line 5a

调用diff -D MARKER f1 f2将生成此合并输出:

line 1
line 2
#ifndef MARKER
line 3a
#else /* MARKER */
line 3b
#endif /* MARKER */
line 4
#ifndef MARKER
line 5a
#else /* MARKER */
line 5c
#endif /* MARKER */

您可以删除预处理程序指令以获取干净的合并文件,例如使用grep

diff -D MARKER f1 f2 | grep -v "MARKER"

请注意,原始输入文件中不得存在令牌MARKER,因此您最好使用更特殊的内容,例如随机令牌,如c11ced4751ef4b3aa60e512bdaa184210441b4ed0