我有两个文件一直在尝试与 diff 进行比较。这些文件是自动生成的,并具有许多如下所示的行:
//! Generated Date : Mon, 14, Dec 2009
我希望忽略这些差异,并开始使用“-I REGEX”标志来实现这一点。
然而,“Date”和冒号之间出现的空格数量各不相同,不幸的是,diff 使用的正则表达式的风格似乎缺少许多基本的正则表达式实用程序。
例如,我一生都无法让“一个或多个”加号起作用。同样处理空白的“\s”表示。
diff -I '.*Generated Date\s+:.*' ....
和
diff -I '.*Generated Date +:.*' ....
两者都失败了。
与其继续盲目地尝试,有人能指出我对正则表达式特定于差异的子集的一个很好的引用吗?
谢谢!
====== 编辑 ========
感谢 FalseVinylShrub,我已经确定我应该转义我的 '+' 和任何类似的字符。这在一定程度上解决了问题。 Diff 成功匹配
.*Generated Date \+.*
和
.*Generated Date *.*
(注意“日期”和“*”之间有两个空格。)
但是,第二个我尝试将 ':' 添加到该表达式中,如下所示:
.*Generated Date \+:.*
和
.*Generated Date \+\:.*
两个版本都无法匹配有问题的字符串,并导致 diff 需要更多的时间来运行。有什么想法吗?
最佳答案
非常有趣...我找不到文档引用,但经过一些实验发现:
␠*
和 .*
如果零个或多个适合您,则工作 ␠+
不起作用。 ␠{1,}
也没有... 但是 ␠\{1,\}
成功了 ␠\+
也有效! (
␠
表示未显示的空格字符)。我正在使用来自 GNU diffutils 2.8.1 的 GNU diff。
man diff
和 info diff
没有解释 RE 语法。希望这会有所帮助。
更新:我在
man grep
中找到了一个简短的部分:Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).
所以我猜它使用的是基本正则表达式语法。
关于regex - "diff"工具的正则表达式风格似乎缺乏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072167/