在没有源文本的情况下编码差异的好方法是什么?

时间:2013-06-05 08:26:40

标签: diff text-processing

情况就像这样:有一些文字

hello world!

它由我的工具处理并转换为某种符号形式,例如

[hello@0, world@6]

(注意!如何被丢弃。)

现在我的工具想建议将there添加到原始源文本中。我的工具可以发回文本数据,因此以某种格式对delta进行编码并将其发送回来是有意义的。以下是diff的示例:

1c1
< hello world!
---
> hello there world!

但问题是我不能使用经典的diff格式,因为我不再有原始文本,而且我无法准确地从我的模型中生成该文本(例如,因为!失踪了。)

我的问题是,是否有一些标准的文本格式可以在行中间编码修改而不知道整行?类似的东西:

insert 'there ' at 1:6

我知道diff本身还有一些其他可能的输出格式,但我找不到任何可以在不需要整个新行内容的情况下将内容添加到行中间的人。

1 个答案:

答案 0 :(得分:1)

diff的输出格式之一是带有ed的{​​{1}}脚本。现在,diff -e生成diff脚本,这些脚本可以进行面向行的编辑,例如删除行或插入行。

但是,由于您不一定使用ed,因此您可以使您的工具输出更精细的diff脚本,该脚本在一行内执行插入和替换。

Ed不支持一行中字符的数字寻址,但可以使用正则表达式匹配/替换来完成。

要从文本ed替换从列m(从1开始计数)开始的n字符序列,您可以使用以下命令:

rep

此处s/\(.\{m-1\}\).\{n\}/\1rep/ m-1被十进制数替换。如果m恰好是1,那么只需

n

您的程序当然要小心逃避s/.\{n\}/&rep/ 的字符。

然后将编辑应用于如下文件:

rep