2

我对 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 中消失。

4

2 回答 2

0

我会看一下解释修饰符使用的许多grep 文档之一。

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

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

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

? 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

不使用 grep 的 Perl 单行:

perl -ne '/^[\d ]+foo/ and print' foo
于 2013-10-10T00:42:54.937 回答
0

grep有时处理括号的方式与 Perl 表达式不同,但这里的罪魁祸首似乎是你没有逃脱+量词。这是一个总结差异的有用页面。尝试这个:

cat foo | grep -e '^[0-9]\+\sfoo'
于 2013-10-10T00:20:19.790 回答