grep模式中的括号表达式

时间:2013-10-10 00:17:34

标签: regex macos bash grep

我对grep如何解释括号表达式(OSX 1.8)感到有点困惑。

我的文件包含如下行:

1   foo 42.0
2   bar 42.1
20  foo 42.3

我想写一个正则表达式,说:'在行的开头,匹配一个或多个数字,然后是空格,然后是字符串foo'。所以我试试看:

cat foo | grep -e "^[0-9]+\sfoo"

但没有任何匹配。咦?这里发生了什么?我在文档中挖了一下,但似乎找不到任何答案。问题似乎在于我对“一个或多个”角色的应用。

请注意,我无法使用Perl样式的表达式,因为此功能似乎已从OSX 10.8中的grep中删除。

2 个答案:

答案 0 :(得分:0)

grep有时处理括号不同于Perl表达式,但这里的罪魁祸首似乎是你没有转义+量词。 Here's a useful page总结了差异。试试这个:

cat foo | grep -e '^[0-9]\+\sfoo'

答案 1 :(得分:0)

我会看一下解释使用修饰符的许多grep documentations中的一个。

Grep了解三种类型的正则表达式:basicextendedPCRE

使用grep中的基本正则表达式,?+等量词必须使用反斜杠进行转义。

重复运算符(或量词)如下:

? The preceding item is optional and matched at most once.
* The preceding item will be matched zero or more times.
+ The preceding item will be matched one or more times.

...

grep -e '^[[:digit:]]\+[[:space:]]\+foo' foo

-E修饰符将模式解释为扩展正则表达式。

grep -E '^[0-9]+\s+foo' foo

Perl one-liner而不使用grep:

perl -ne '/^[\d ]+foo/ and print' foo