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


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

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

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

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

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

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

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

两者都失败了。

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

谢谢!

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

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

.*Generated Date \+.*

.*Generated Date  *.*

(注意“日期”和“*”之间有两个空格。)

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

.*Generated Date \+:.*

.*Generated Date \+\:.*

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


11265
2018-01-15 14:22


起源

你的':'问题:我没有弄清楚为什么,但尝试(a)使用[:]看看是否有任何特殊效果,即使反斜杠没有,或(b)使用。如果你不担心误报,那就匹配那个位置的任何东西...只是在黑暗中刺伤...... - FalseVinylShrub


答案:


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

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

 表示没有出现的空格字符。

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

man diff 和 info diff 没有解释RE语法。

希望这可以帮助。

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

基本与扩展正则表达式

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

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


10
2018-01-15 14:43



哼!我正在使用完全相同版本的GNU diff,所以这是一个很好的理智检查。我用正则表达式改变了一点,看得出来,你是对的!问题是,它似乎在“:”上可怕地打破了。我将编辑我的原始帖子来描述问题。 - zslayton


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

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);

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

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

忘记\ s,\ S等


6
2018-01-15 15:25





根据规范diff 不支持正则表达式,也不支持正则表达式 -I 开关。

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


-1
2018-01-15 14:39



我正在使用GNU diff 2.8.1。那是不标准的? - zslayton
GNU diff 2.8.1是许多GNU / *操作系统(如Linux)使用的非常常见的版本。如果GNU工具包不能被视为标准,我不知道什么可以。看到 gnu.org/software/diffutils/manual/#Specified-Lines 对于-I开关上的(稀疏)文档。 - Martijn Heemels