我有两个文件,我一直在尝试与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需要花费更多的时间来运行。有什么想法吗?
答案 0 :(得分:10)
非常有趣......我找不到文档参考,但经过一些实验发现:
␠*
和.*
如果零或更多可以为你工作␠+
不起作用。 ␠{1,}
... {␠\{1,\}
无效 ␠\+
也有效!(␠
代表一个没有出现的空格字符。
我正在使用GNU diffutils 2.8.1中的GNU diff。
man diff
和info 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 specification,diff
不支持正则表达式,也没有-I
切换。
您似乎使用的是非标准diff
非标准扩展程序。这些非标准扩展如何工作,应该在您正在使用的任何非标准diff
的文档中进行描述。