如何反转wdiff输出?以及如何从wdiff差异文件恢复原文件?
如何从wdiff输出恢复原始文件并反转差异?
没问题,我来一步步帮你解决这个问题——从wdiff生成的diff.txt里还原原始的old.txt、new.txt,以及反转wdiff差异输出的方法都很直观,咱们直接看具体操作:
一、恢复原始的old.txt
wdiff的标记规则很明确:[-内容-]代表仅在old.txt中存在、new.txt中被删除的内容,而没有标记的普通文本是两个文件共有的。所以要恢复old.txt,只需要:
- 保留所有普通文本
- 保留
[-和-]之间的内容,同时去掉这两个标记符号 - 完全移除
{+内容+}这类new.txt独有的新增内容
用sed命令可以一键完成:
sed 's/\[-//g; s/-]//g; s/{+[^}]+}//g' diff.txt > old.txt
执行完后运行cat old.txt,就能得到原始内容:This is not what I want.
二、恢复原始的new.txt
同理,{+内容+}代表仅在new.txt中存在、old.txt中没有的新增内容。恢复new.txt的逻辑是:
- 保留所有普通文本
- 保留
{+和+}之间的内容,去掉标记符号 - 完全移除
[-内容-]这类old.txt独有的内容
对应的sed命令:
sed 's/\[-[^-]+\-]//g; s/{+//g; s/+}//g' diff.txt > new.txt
验证一下,cat new.txt会输出:This is what I want!
三、反转wdiff的输出
反转wdiff输出的本质是交换差异的对比方向:把原来“old→new”的变化,转换成“new→old”的变化。具体来说就是:
- 把原输出中
[-内容-](old独有,new删除)转换成{+内容+}(从new到old是新增) - 把原输出中
{+内容+}(new独有,old没有)转换成[-内容-](从new到old是删除)
用sed实现这个标记互换:
sed 's/\[-/{+/g; s/-]/+}/g; s/{+/\[-/g; s/+}/-]/g' diff.txt > reversed_diff.txt
执行后查看reversed_diff.txt,内容会变成:This is {+not+} what I [-want!-] {+want.+},这就是new.txt到old.txt的差异输出了。
内容的提问来源于stack exchange,提问作者Davide Fiocco
相关产品推荐
相关产品推荐

