为何使用grep过滤SVN修改的.m文件时返回不符合预期的结果?
为什么你的grep命令没过滤掉.slx文件?
哈哈,这个问题我之前也碰到过!问题出在你第二个grep的正则写法上,咱们一步步拆解:
问题根源
- 正则元字符的坑:
grep ".m"里的.是正则表达式的元字符,它能匹配任意单个字符,而不是你以为的仅匹配点号。虽然这个点在你的案例里不是直接原因,但也是个隐患——比如它会匹配像file12m.txt这种文件名里的“2m”。 - 未锚定行尾+输出合并:你得到的结果
M foo.m M model1.slx看起来像是两行svn status输出被合并成一行了(可能是终端宽度不够折行,或者输出格式异常)。第二个grep ".m"只是找行内任意位置的匹配,只要行里有.m(也就是foo.m部分),整行就会被保留,连带后面的model1.slx一起显示出来。
解决方案
下面是几种靠谱的修正方法,任选其一即可:
方法1:修正第二个grep的正则
svn status | grep "M " | grep "\.m$"\.:转义点号,确保匹配实际的.字符$:锚定到行尾,保证.m是文件名的最后部分,精准筛选.m文件
方法2:用单个grep完成过滤(减少管道)
svn status | grep "M .*\.m$"这个正则直接匹配“以
M开头,最后以.m结尾”的行,一次性完成筛选,效率更高。方法3:用awk实现更直观的逻辑
svn status | awk '/M / && /\.m$/'awk的写法逻辑清晰:同时满足“包含
M”和“以.m结尾”的行才会被输出。
试试上面的命令,就能只看到你想要的foo.m啦!
内容的提问来源于stack exchange,提问作者Lauri
相关产品推荐
相关产品推荐

