为什么grep给出意想不到的结果?

时间:2018-04-05 12:23:12

标签: linux grep

我的扩展名为.m和.slx的文件。我想用grep从svn log中检查修改过的m文件:using

svn status | grep "M  " | grep ".m"

我得到了

M       foo.m
M       model1.slx.

我希望只看到foo.m.但为什么我也会看到model1.slx呢?它应该被第二个grep过滤掉。

3 个答案:

答案 0 :(得分:2)

您遇到的问题是因为.是正则表达式上下文中的元字符,需要对其进行转义以剥夺其特殊含义(以匹配任何字符)。

如果您要列出仅以.m.slx结尾的文件或以M开头且以.m结尾的文件,则您的要求不明确。前者使用下面的建议,后者使用grep ^M.*\.m$

通过启用grep扩展正则表达式支持模式,您可以使用一个-E

svn status | grep -E '(\.m|\.slx)$' 

交替|运算符默认情况下在ERE模式下启用,但在使用BRE(基本正则表达式)模式时需要进行转义

svn status | grep '\.m$\|\.slx$'

答案 1 :(得分:1)

.匹配任何字符。对于.字符,每the POSIX regex rules位:

  

匹配任何单个字符(许多应用程序不包括换行符,并且确切地说哪些字符被视为换行符是flavor,character-encoding-和platform-specific,但可以安全地假设包含换行符)。在POSIX括号表达式中,点字符与文字点匹配。例如,ac匹配" abc"等,但[ac]仅匹配" a","。"或" c&#34 ;

要匹配.括号中的[]字符,您需要使用\字符对其进行转义:

\.m

将与文字.m匹配。

答案 2 :(得分:0)

我想用grep来检查svn logs中修改过的m文件:

$ svn status | grep ^M.*\.m$
M       foo.m

即。行以M开头,以.m结尾。