格雷普搞砸了我的理解

时间:2011-09-17 10:35:15

标签: regex grep

有一段时间我一直试图用grep来从文件中检索数据,我注意到了一些有趣的东西。

这可能是我的无知,但这就是发生的事情......

假设我有一个ABC文件。数据是:

a
abc
ab
bac
bb
ac

现在运行这个grep命令,

grep a* ABC

我发现输出包含以b.c开头的行。为什么会这样?

4 个答案:

答案 0 :(得分:2)

您使用'a *'作为搜索模式...'*'表示前一个字符的ZERO或更多,因此'b.c'匹配,其中包含ZERO或更多'。

在一个半相关的说明中,我建议引用'a *'位,因为如果当前子目录中有任何以a开头的文件,你会非常惊讶地看到你真的是搜索,因为shell(bash,zsh,csh,sh,dash,wtfsh ...)将在执行命令之前自动执行通配符扩展。

如果你想搜索以'a'开头的行,那么你需要用一个前导^字符来锚定搜索模式,这样你的模式就会变成'^ a *',但同样,*表示ZERO或者更多,所以在你只有一个字母的情况下它没有用...改为使用'^ a'。

作为一个人为的例子,如果你想找到包含'c'的所有行和包含字母'bc'的行,那么你可以使用'b * c'作为搜索模式......意味着ZERO或更多b,和c。

正则表达式搜索模式的力量是巨大的,需要一些时间来理解。仔细阅读grep(1),regex(7),pcre(3),pcresyntax(3),pcrepattern(3)的手册页。

一旦掌握了它们,正则表达式在sed,grep,perl,vim(也可能是emacs)中都很有用,......呃,它已经很晚了(早期?)没有什么可以想到的,但它们是非常强大。

作为奖励,“*”表示零或更多,“+”表示一个或多个,以及“?”是指ZERO或ONE。

所以搜索两个或更多a的东西......'aa +',即1 a和1+ a(1或更多)

我漫步......(正则表达式(7)!)

答案 1 :(得分:1)

grep尝试在整行中找到该模式。使用^a获取从a^a*$开始的行,以查找仅包含a的行(包括空行)。

另外,请引用那个shell参数(例如:'^a*$'),如果你使用a*并且工作目录中有一个以a开头的文件你会变得非常奇怪结果...

答案 2 :(得分:0)

试试这个,它对我有用。 ^表示行的开头 - 因此必须以a开头。

grep ^a ABC

答案 3 :(得分:0)

您需要在模式周围加上引号:

grep "a*" ABC

否则*由shell(它进行通配符文件名匹配)解释,而不是由grep本身解释。