“差异”工具的正则表达式的味道似乎缺乏?

时间:2010-01-15 14:22:25

标签: regex diff

我有两个文件,我一直在尝试与diff进行比较。这些文件是自动生成的,并且包含许多行,如下所示:

//!   Generated Date  : Mon, 14, Dec 2009

我希望忽略这些差异,并且已经开始使用“-I REGEX”标志来实现这一点。

然而,“Date”和冒号之间出现的空格数量各不相同,不幸的是,diff使用的正则表达式的味道似乎缺少一些基本的正则表达式实用程序。

例如,我不能为我的生活获得“一个或多个”加号工作。同样处理空白的“\ s”表示。

diff -I '.*Generated Date\s+:.*' ....

diff -I '.*Generated Date +:.*' ....
两者都失败了。

不是继续盲目地尝试,有人可以指出我对正则表达式的diff特定子集的一个很好的参考吗?

谢谢!

=====编辑=======

感谢FalseVinylShrub,我已经确定我应该逃避我的'+'和任何类似的角色。这有点解决了这个问题。差异成功匹配

.*Generated Date \+.*

.*Generated Date  *.*

(请注意,“Date”和“*”之间有两个空格。)

然而,第二个我尝试将':'添加到该表达式中,如下所示:

.*Generated Date \+:.*

.*Generated Date \+\:.*

两个版本都无法匹配相关字符串,导致diff需要花费更多的时间来运行。有什么想法吗?

3 个答案:

答案 0 :(得分:10)

非常有趣......我找不到文档参考,但经过一些实验发现:

  • ␠*.*如果零或更多可以为你工作
  • 如你所说,␠+不起作用。 ␠{1,} ... {␠\{1,\} 无效
  • 更新:␠\+也有效!

代表一个没有出现的空格字符。

我正在使用GNU diffutils 2.8.1中的GNU diff。

man diffinfo diff没有解释RE语法。

希望这有帮助。

更新:我在man grep中找到了一个简短的部分:

  

基本与扩展正则表达式

     

在基本正则表达式中,元字符?,+,{,|,(和)   失去他们的特殊意义;而是使用backslashed版本\?,   \ +,\ {,\ |,\(和\)。

所以我猜它正在使用Basic正则表达式语法。

答案 1 :(得分:6)

好的,这就是GNU差异源所说的内容。

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);

我认为这意味着“与gnu grep -G相同”(基本正则表达式)。根据gnu grep手册页:

  

在基本的正则表达式中,元字符?,+,{,|,(,   和)   失去他们的特殊意义;而是使用backslashed版本   \?,\ +,\ {,\ |,\(和\)。

忘掉\ s,\ S等

答案 2 :(得分:-1)

According to the specificationdiff不支持正则表达式,也没有-I切换。

您似乎使用的是非标准diff非标准扩展程序。这些非标准扩展如何工作,应该在您正在使用的任何非标准diff的文档中进行描述。