Algorithm 识别文件中的搜索和替换操作

Algorithm 识别文件中的搜索和替换操作,algorithm,Algorithm,假设您有一个源文件,其中有人使用简单的文本替换将一个符号重命名为另一个符号。该文件上的diff输出通常相当长,不是一个非常有用的标识符。您想知道的是,如果更改只是s/a/b/g,如果是,那么a和b是什么-您不会提前告诉这个工具,它必须自己解决。(为了便于论证,您可以在这里假设“a”和“b”不包含换行符。) 您将使用什么算法来发现搜索并替换?(简单) 如果发生了几个文本替换,您将如何使其工作?(相当容易) 在不比较两个原始文件的情况下,如何编写它来处理diff输出?(相当困难) 例如,通过识别r

假设您有一个源文件,其中有人使用简单的文本替换将一个符号重命名为另一个符号。该文件上的diff输出通常相当长,不是一个非常有用的标识符。您想知道的是,如果更改只是
s/a/b/g
,如果是,那么
a
b
是什么-您不会提前告诉这个工具,它必须自己解决。(为了便于论证,您可以在这里假设“a”和“b”不包含换行符。)

  • 您将使用什么算法来发现搜索并替换?(简单)
  • 如果发生了几个文本替换,您将如何使其工作?(相当容易)
  • 在不比较两个原始文件的情况下,如何编写它来处理diff输出?(相当困难)
  • 例如,通过识别regexp匹配项而不是搜索/替换项,您可以在多大程度上做到这一点?(硬的)
  • 在一个包含此类更改和其他更改的文件中,您能想出一个启发式方法来生成sed表达式和一个大大缩短的diff吗?(硬的)

对于那些喜欢设计算法的人来说,这是一个问题,但它松散地基于我想使用的实际工具,因此,如果您碰巧知道一个很好的命令行工具可以完成上述任何一项,那么您将获得额外的积分

我现在想到两个选择:

  • 运行
    /s/b/a/g
    并区分文件(尽管这显然不会在正则表达式中发现错误)
  • 制作您自己的diff工具,其工作原理与其他工具相同,但接受某些更改而不将其显示为差异(即,如果某一行不同,且该行的差异仅在于一侧的
    a
    ,另一侧的
    b
    ,则不要标记该行)

    • 对此类更改有特殊处理,因此它确实有一个算法。因此,试着查看他们的文档/询问他们。重用该算法可能有点困难,因为它是用英文编写的。

      啊,但我指的是任意更改,在运行该工具时您不知道。更新的问题反映了这一点。对文档的最快浏览表明,您使用了一个特殊的替换命令,该命令执行替换并标记替换已发生,而不是根据其效果来识别它。注意,我可能错了。当你谈到正则表达式时,有没有可能原始字符串的一部分在替换字符串中被重用?我认为,这比简单的正则表达式搜索要困难得多,但取而代之的是常量操作(你可以在列表中写两个不同的项目)。多个文本替换听起来并不容易,因为顺序可能很重要:
      s/programmer/developer
      ,然后是
      s/program/executable
      程序员的影响不同。我们是否可以假设操作只影响整个单词(编程语言的标记)?我很高兴看到即使是简单的情况也能解决这个问题,只要您指出了限制。我不认为在一般情况下发现regexp匹配是可能的,我怀疑如果有重叠的搜索-替换对,任何合理的算法都会产生与作者实际使用的不同的搜索/替换集。但是,考虑到目前缺乏任何解决方案,即使是部分答案也总比没有好,所以请陈述您的假设并从那里开始。