我对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中删除。
答案 0 :(得分:0)
grep
有时处理括号不同于Perl表达式,但这里的罪魁祸首似乎是你没有转义+
量词。 Here's a useful page总结了差异。试试这个:
cat foo | grep -e '^[0-9]\+\sfoo'
答案 1 :(得分:0)
我会看一下解释使用修饰符的许多grep documentations中的一个。
Grep
了解三种类型的正则表达式:basic
,extended
和PCRE
。
使用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