Regex 第一场比赛

Regex 第一场比赛,regex,pcre,Regex,Pcre,我正在使用grep从文件中提取部分,但在使其正常工作时遇到了问题。从一串 something0( something1 我想提取一些东西。这在一些输入上工作得很好 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' 我如何让gr

我正在使用grep从文件中提取部分,但在使其正常工作时遇到了问题。从一串

something0( something1
我想提取一些东西。这在一些输入上工作得很好

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将读取包含这些行的整个文件,如果我没有错,这将只输出文件中的第一个匹配项。假设某物0不包含任何“(”是可以的

谢谢

-呃,你确定吗

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

(还请注意,最后一个
+
是不必要的;正则表达式相当于较短的
(?m^.+?(?=\(.)

尝试下一个正则表达式。同样有效:

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

你想要什么就匹配什么

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

是的,我确定。输出是'ab'和'()cd'。谢谢你指出多余的'+'。谢谢。我知道这个问题很简单,但正则表达式对我来说是相当陌生的。