我的扩展名为.m和.slx的文件。我想用grep从svn log中检查修改过的m文件:using
svn status | grep "M " | grep ".m"
我得到了
M foo.m
M model1.slx.
我希望只看到foo.m.但为什么我也会看到model1.slx呢?它应该被第二个grep过滤掉。
答案 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
结尾。