文件A
Apples
Bananas
Clementines
Dates
文件B
Apples
Blueberries
Cherries
Dates
我想比较 A 和 B 来生成一个补丁,当应用于 C 时会更改该行Clementines > Cherries
,但会忽略第二行(蓝莓/黑醋栗/其他)。
文件C(补丁前)
Apples
Blackcurrants
Clementines
Dates
文件C(补丁后)
Apples
Blackcurrants
Cherries
Dates
理想情况下,我想要一个带有上下文的补丁,因为不能保证该序列始终出现在文件中的同一位置。在我看来,上下文将包含某种形式的通配符行 afterApples
和 before Clementines
。
如果有必要,我愿意手动编辑diff
输出,但是如果有一个可重复的命令来创建基于上下文的差异,并使用通配符代替特定的正则表达式匹配,那就太好了。
我希望能够将此补丁发送给拥有文件 C 的朋友,并让他们运行命令,patch
而无需手动编辑任何内容。
如何才能做到这一点?
答案1
假设您正在使用 GNU diff
,则无法让它生成您想要的确切补丁。可以要求diff
忽略与给定正则表达式匹配的行,与-I
选项,但它只会忽略仅包含此类更改的整个块。在这种情况下,任何大块头(即使没有上下文)都会更改“香蕉”和“克莱门汀”行。
一种不涉及花哨的补丁编辑的可能性是要求diff
生成一个ed
脚本:
diff -e
这将产生
2,3c
Blueberries
Cherries
.
可以对其进行修改以生成您想要的补丁:
3,3c
Cherries
.
答案2
如果这样做patch(1)
,不适合的部分将保存在拒绝文件中。然后你可以检查一下那个并申请(或不申请)那些没有进入的帅哥。
另一种可能性(对于铁杆运动员)是只编辑补丁。请注意,该diff(1)
格式是为了可读性而设计的,不是进行编辑。您必须小心,不要弄乱行号或其他标记。
如果您想创建一个用于分发的补丁,也许最简单的路径是按原样应用补丁,编辑生成的文件以进行品味,然后根据编辑的文件重做补丁。