bash中的=~操作符支持什么正则表达式语法?

bash中的=~操作符支持什么正则表达式语法?,bash,Bash,我发现我可以在4.2.10(1)BASH中使用=~操作符而不是expr命令。它(在命令中)比expr快得多,这一事实在循环中可能非常重要,重复次数也很大 我能够使用正则表达式的大部分元字符,但不是全部 例如,我可以检查一个字符串是否正好匹配(一个小字母、一个数字、一个点)的3次重复: 我可以选择匹配的子字符串: [[ "whatis12345thetwo765nmbers" =~ ^[a-z]+([0-9]+)[a-z]+([0-9]+) ]] && \ echo "The tw

我发现我可以在4.2.10(1)BASH中使用
=~
操作符而不是
expr
命令。它(在命令中)比
expr
快得多,这一事实在循环中可能非常重要,重复次数也很大

我能够使用正则表达式的大部分元字符,但不是全部

例如,我可以检查一个字符串是否正好匹配(一个小字母、一个数字、一个点)的3次重复:

我可以选择匹配的子字符串:

[[ "whatis12345thetwo765nmbers" =~ ^[a-z]+([0-9]+)[a-z]+([0-9]+) ]] && \
echo "The two number fields are: ${BASH_REMATCH[1]}  ${BASH_REMATCH[2]}"
The two number fields are: 12345  765
但是我想使用更多的元字符,比如上面列出的那些

我特别想匹配单词的边界:
\b
\b

我试图在高级Bash脚本指南(第18章和第37章)中找到答案,但没有成功

在哪里可以找到
=~
运算符的详细说明


目前,我只对BASH感兴趣,而对gawk、sed、perl或其他工具不感兴趣。

=~
支持POSIX ERE,没有本地C库添加的扩展(字面上,它调用标准C库的regex调用)。因此,关于保证支持的特性的规范文档(与本地C库可能添加的可选特性相反)是ERE上的规范


为了进一步说明这一点:任何东西,例如bash手册中的
\:

另外还有一个二进制运算符=~,其优先级与==和!=相同。使用时,运算符右侧的字符串被视为扩展正则表达式,并且 相应地匹配(如正则表达式(3))


关于扩展(posix)正则表达式在您的系统上如何工作的最佳资源是IMHO
man egrep

。一般来说,TLDP的文档通常不准确或过时(或准确,但显示了展示错误做法的示例)。bash hackers wiki和Greg Wooledge wiki是关于bash的许多信息来源。至于您的具体问题:bash没有自己的正则表达式实现——这取决于您的平台——因此,在您的问题中包括该平台非常重要,除非您只对可移植子集感兴趣。(当然,在第一条评论中,s/much-sources/more-better-sources/)。顺便说一句,就你对单词边界感兴趣而言,我经常使用
(^ |[[:space:]])单词匹配($|[:space:])
或类似。它的语义并不完全相同,但通常足够好。通常,比grep手册页中给出的规范更好的规范可以在
man7re_格式
man7regexp
中找到(取决于OP的平台)@CharlesDuffy虽然
man7
文档解释了标准,而不是如何在我的个人系统上实现标准(我指的是GNU扩展),但我认为它们有点像“文本墙”风格。
man egrep
是我选择的页面。但是,如果我想知道什么是可移植的,我会看看你在回答中链接的POSIX文档。我不想太迂腐,但我认为值得一提的是,这个问题是关于“=~操作符支持什么”扩展正则表达式的posix标准不是什么。事实上,如果代码在GNU系统上运行,它可能会支持更多的功能。这些更多的功能就是为了使用它们而设计的!一些实现和它们的发行商可能会以posix为借口,但事实上他们只是没有进一步开发这些工具。GNU就是这么做的。我认为我们应该尊重这一点。@hek2mgl,如果你知道你的代码永远不会在任何非GNU平台上运行,那是一回事,但不是每个人都有这样的保证——问题是bash将支持什么(唯一合理的答案是它保证只支持它所使用的库调用的东西,保证支持).Heck,即使使用Linux内核,glibc仍然不是唯一的内核——当我构建一个嵌入式设备时,我很可能会使用musl libc而不是glibc,而且有很好的理由:@hek2mgl,不管怎样,正如我在一篇关于问题的评论中指出的那样,=~操作符支持什么是一个只有在指定平台的情况下才能以特定于平台的方式回答的问题,OP没有提供任何此类规范。我观察到的最新趋势是使用Alpine(musl,基于忙盒)作为容器的基础映像!欢迎回到shell-script-80!(事实上,当时我从来没有写过脚本,但我们在学校写过)为了几MB的优势!但对于嵌入式开发来说,这(仍然:)是有意义的,当然。至少现在busybox已经有了ash。回到它的外壳选项甚至都不是POSIX-y的时候……这不是一个快乐的时光。
[[ "whatis12345thetwo765nmbers" =~ ^[a-z]+([0-9]+)[a-z]+([0-9]+) ]] && \
echo "The two number fields are: ${BASH_REMATCH[1]}  ${BASH_REMATCH[2]}"
The two number fields are: 12345  765