PCRE - 第一场比赛

时间:2012-03-10 08:52:33

标签: regex pcre

我正在使用grep从文件中提取部件,但是我无法正常工作。从一个字符串,

something0( something1

我想提取一些东西0。这在某些输入上工作正常,

echo 'a b( c d' | grep -Po '(?m)^.+?(?=\(.+)'   #outputs 'a b'

但在其他输入上却不太好,

echo 'a b( )c d( e f' | grep -Po '(?m)^.+?(?=\(.+)'   #outputs 'a b' and '( ) c d'

我如何让grep只返回第一场比赛或改进我的正则表达式?管道greps输出到,

head -n 1

不是替代品,因为grep将使用这些行读取整个文件,如果我没有错误,则只会输出文件中的第一个匹配项。假设something0不包含任何'('。

感谢。

-P

3 个答案:

答案 0 :(得分:0)

呃,你确定吗?

$ echo 'a b( )c d( e f' | grep -Po '(?m)^.+?(?=\(.+)'
a b

(另请注意,最后+是不必要的;正则表达式等同于较短的(?m)^.+?(?=\(.)

答案 1 :(得分:0)

尝试使用下一个正则表达式。也有效:

$ echo 'a b( c d' | grep -Po '^([^(]*)'
a b
$ echo 'a b( )c d( e f' | grep -Po '^([^(]*)'
a b

答案 2 :(得分:0)

如何准确匹配您想要的内容?

^[^(]*?(?=\()