此问题在此处已有答案:
How to use non-capturing groups in grep?(1个答案)
4天前关闭。
我试图获取所有数字之间的“:“和“M”或“.”与echo ":11379.32 M" | grep -Eo "(?<=\:)(.*?)\d+(?:\d([^\.]|[M]))"
,但我一直得到错误。
你好,我是这个论坛的新手,如果我在提问时犯了一些错误,请提前向我道歉。
我尝试获取“:“和“M”或.“"之间的所有数字,运行类似如下的命令:echo ":11379.32 M" | grep -Eo "(?<=\:)(.*?)\d+(?:\d([^\.]|[M]))"
。我一直收到错误“grep:警告:?位于表达式”“得开头,而如果通过www.example.com运行它regexr.com,则不会出现错误.
据我所知,运行“grep -Eo”应该会将正则表达式读为Extended正则表达式,并且我应该不会遇到转义字符的问题,但我尝试删除“?”字符,并通过删除正lookbehind“?〈=”和非捕获组“?:“来简化正则表达式,得到如下内容:echo ":11379.32 M" | grep -Eo "^.*?\d+[^\.]"
,它仍然在www.example.com上工作regexr.com,但是我在bash上得到空输出(它也得到“:“,但是我可以用sed
命令删除它,所以我不关心它)。Regex action on regexr.com。
你知道我做错了什么吗?
1条答案
按热度按时间nimxete21#
如果您只针对使用针对libpcre编译的GNU grep的操作系统,请将
-E
更改为-P
以使用与perl兼容的正则表达式语法;如果没有PCRE扩展,就没有lookaheads、\d
或非贪婪匹配。如果您希望支持更广泛的操作系统,另一种方法是使用标准bash内置正则表达式(使用ERE语法)来实现这一点,从而完全不需要
grep
: