regex 错误bash grep:“grep:警告:在表达式”“得开头使用?,同时匹配2个字符之间得数字[重复]

zsohkypk  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(132)

此问题在此处已有答案

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
你知道我做错了什么吗?

nimxete2

nimxete21#

如果您只针对使用针对libpcre编译的GNU grep的操作系统,请将-E更改为-P以使用与perl兼容的正则表达式语法;如果没有PCRE扩展,就没有lookaheads、\d或非贪婪匹配。
如果您希望支持更广泛的操作系统,另一种方法是使用标准bash内置正则表达式(使用ERE语法)来实现这一点,从而完全不需要grep

re=':([[:digit:]]+)([.]|[[:space:]]*M)'
string='1:11379.32 M'

if [[ $string =~ $re ]]; then
  echo "Matched ${BASH_REMATCH[1]}"  # prints "Matched 11379"
else
  echo "No match"
fi

相关问题