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

zsl*_*ton 11 regex diff

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

//!   Generated Date  : Mon, 14, Dec 2009
Run Code Online (Sandbox Code Playgroud)

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

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

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

diff -I '.*Generated Date\s+:.*' ....
Run Code Online (Sandbox Code Playgroud)

diff -I '.*Generated Date +:.*' ....
Run Code Online (Sandbox Code Playgroud)

两者都失败了.

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

谢谢!

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

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

.*Generated Date \+.*
Run Code Online (Sandbox Code Playgroud)

.*Generated Date  *.*
Run Code Online (Sandbox Code Playgroud)

(请注意,"Date"和"*"之间有两个空格.)

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

.*Generated Date \+:.*
Run Code Online (Sandbox Code Playgroud)

.*Generated Date \+\:.*
Run Code Online (Sandbox Code Playgroud)

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

Fal*_*rub 10

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

  • ?*.*工作,如果为零或更多的是给你OK
  • 正如你所说,?+不起作用.也没有?{1,}...但?\{1,\} 确实有效
  • 更新:?\+也有效!

(?表示没有出现的空格字符).

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

man diffinfo diff没有解释RE语法.

希望这可以帮助.

更新:我发现了一个简短的部分man grep:

基本与扩展正则表达式

在基本的正则表达式中,元字符?,+,{,|,(和)失去了它们的特殊含义; 而是使用反斜杠版本\?,\ +,\ {,\ |,\(和\).

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


Way*_*rad 6

好的,这是GNU差异源所说的.

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);
Run Code Online (Sandbox Code Playgroud)

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

在基本的正则表达式中,元字符?,+,{,|,(和)失去了它们的特殊含义; 而是使用反斜杠版本\?,\ +,\ {,\ |,\(和\).

忘记\ s,\ S等