【问题标题】:Diff + patch - Sum instead of replaceDiff + patch - 求和而不是替换
【发布时间】:2011-09-18 07:33:23
【问题描述】:

假设我有一个文件 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 求和而不是替换文件中的差异。我该怎么做?

【问题讨论】:

  • 这不是 diff 和 patch 的用途。您将需要使用支持合并的实际工具。
  • 有什么建议吗?
  • 并非如此。我把它留给我的 VCS 来处理。

标签: bash diff patch


【解决方案1】:

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

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 这样的随机令牌。

【讨论】:

    【解决方案2】:

    您很少提及您要解决的问题(或者您过多地谈论您所采取的方法是如何不起作用的)。更有趣的是你想​​做的事。

    也许你可以完成

    sort -u A B
    

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

    【讨论】:

      【解决方案3】:

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

      编辑: 更多工具:

      • 融合
      • gPyFm
      • diff3
      • tkdiff
      • P4Merge

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

      【讨论】:

      • kdiff 的问题是它需要整个 kde 基础,考虑到我的大部分工作都是在 CLI 上完成的,这相当繁重。我安装了 meld,但是当我告诉它合并时,它的作用与 diff+patch 相同。
      • 当然每个工具都有它的依赖项。因为我不知道你的环境我不能推荐任何基于此的东西。但我知道kdiff3 做得非常好。不过我添加了一些程序,也许你会发现更多......
      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2012-09-20
      相关资源
      最近更新 更多