我发现我可以在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或其他工具。
答案 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)不包含 <
,>
,b
或B
;这些都是GNU扩展和非便携式。
答案 1 :(得分:0)
bash手册说:
可以使用另外的二元运算符=〜,其优先级与==和!=相同。使用它时,操作符右侧的字符串被视为扩展正则表达式 相应地匹配(如在正则表达式(3)中)。
扩展(posix)正则表达式如何在 系统上运行的最佳资源是恕我直言{{1}}。