1

情况是这样的:有一些文字

hello world!

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

[hello@0, world@6]

(注意如何!丢弃)。

现在我的工具想要推荐添加there到原始源文本中。我的工具可以发回文本数据,因此以某种格式对增量进行编码并将其发回是有意义的。这是一个带有diff的示例:

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

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

我的问题是,是否有一些标准的文本格式可以在不知道整行的情况下对行中间的修改进行编码?就像是:

insert 'there ' at 1:6

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

4

1 回答 1

1

的输出格式之一diffed带有diff -e. 现在,diff生成ed进行面向行的编辑的脚本,例如删除行或插入行。

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

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

要将从 m 列(从 1 开始计数)开始的 n 个字符序列替换为 text rep,可以使用以下命令:

s/\(.\{m-1\}\).\{n\}/\1rep/

这里m-1n被十进制数字代替。如果 m 恰好为 1,那么只需

s/.\{n\}/&rep/

当然,您的程序在转义 的字符时要小心rep

然后将编辑应用于这样的文件:

$ cp file file.tmp                        # operate in-place on file.tmp
$ (cat diffs ; echo wq) | ed -q file.tmp  # edits are in file "diffs"
于 2013-06-10T22:02:55.627 回答