bash中的=〜运算符支持哪种正则表达式语法?

时间:2016-02-17 13:02:00

标签: bash

我发现我可以在4.2.10(1)BASH中使用 =~ 运算符代替 expr 命令。它比expr快得多(在一个命令中),并且这个事实在重复循环中很重要。

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

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

[[ "b3.f5.h3." =~ ^([a-z][0-9]\.){3}$  ]] && echo OK
OK

我可以选择匹配的子串:

[[ "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

但我想使用更多元字符,例如this TLDP page上列出的元字符。

我特别喜欢匹配字边界: \b \B \< \>

我试图在 Advanced Bash-Scripting Guide 中找到答案(在第18章和第37章中),但未成功。

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

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

2 个答案:

答案 0 :(得分:5)

=~支持POSIX ERE,除了本地C库添加的扩展之外没有任何扩展(字面意思是,它调用标准C库的正则表达式调用)。因此,关于它保证支持的功能的规范文档(与本地C库可能添加的可选功能相反)是ERE上的规范,IEEE 1003.1, section 9.4

要放大这一点:由一个特定的libc(即glibc)添加但在POSIX规范中不存在的任何内容,例如\<,不能指望在所有平台上都可以移植bash支持

POSIX指定的特殊字符(given in section 9.4.3 of the standard不包含 <>bB ;这些都是GNU扩展和非便携式。

答案 1 :(得分:0)

bash手册说:

  

可以使用另外的二元运算符=〜,其优先级与==和!=相同。使用它时,操作符右侧的字符串被视为扩展正则表达式          相应地匹配(如在正则表达式(3)中)。

扩展(posix)正则表达式如何在 系统上运行的最佳资源是恕我直言{{1}}。