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

标签 linux grep

我有扩展名为 .m 和 .slx 的文件。我想使用 grep 从 svn 日志中检查修改后的 m 文件:使用

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

我明白了

M       foo.m
M       model1.slx.

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

最佳答案

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

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

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

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

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

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

关于linux - 为什么 grep 给出意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672314/

相关文章:

linux - Grep 在另一个应用程序正在写入的文件上

Ruby 相当于 grep -v

linux - 检查进程是否正在运行

c - 标记掩码读写 posix

grep - 为什么我的 grep 命令在某些行之间输出 "--"?

linux - 哈希函数从文件路径生成哈希键

在后台运行的 Linux 守护进程

linux - Egrep 结果是当前命令和垃圾

linux - 使用 Go 和 './...' 构建所有代码

c++ - 此类的对象如何仍然能够访问其成员函数?