$BASH_REMATCH
在 zsh
中的等效物是什么,如何使用?
或者,可以简单地使用
$match[1]
代替
$BASH_REMATCH[1]
zsh
与bash
的行为相同,请使用以下命令:setopt BASH_REMATCH
或者在一个函数内考虑:
setopt local_options BASH_REMATCH
(这只会在函数范围内设置选项)
然后,像在bash
中一样使用$BASH_REMATCH
。
手册对BASH_REMATCH
进行了说明:
当设置时,使用=~运算符执行的匹配将设置BASH_REMATCH数组变量,而不是默认的MATCH和match变量。BASH_REMATCH数组的第一个元素将包含整个匹配的文本,后续元素将包含提取的子字符串。当KSH_ARRAYS也设置时,此选项更有意义,以便将整个匹配部分存储在索引0处,并且第一个子字符串位于索引1处。如果没有设置此选项,则MATCH变量包含整个匹配的文本,而match数组变量包含子字符串。
然后=~
将像在bash
中一样工作,但如果您想要完全按照手册中描述的行为:
string =~ regexp
如果string与正则表达式regexp匹配,则为true。如果设置了RE_MATCH_PCRE选项,则使用zsh/pcre模块将regexp测试为PCRE正则表达式,否则使用zsh/regex模块将其测试为POSIX扩展正则表达式。在成功匹配时,将更新一些变量;如果匹配失败,则不更改任何变量。
如果未设置BASH_REMATCH选项,则标量参数MATCH设置为与模式匹配的子字符串,整数参数MBEGIN和MEND分别设置为匹配在string中开始和结束的索引,因此如果string包含在变量var中,则表达式'${var[$MBEGIN,$MEND]}'与'$MATCH'相同。尊重设置选项KSH_ARRAYS。同样,数组match设置为与括号子表达式匹配的子字符串,数组mbegin和mend设置为子字符串在string中的开始和结束位置的索引。如果没有括号子表达式,则不设置数组。例如,如果将字符串'a short string'与正则表达式's(...)t'匹配,则(假设未设置选项KSH_ARRAYS)MATCH、MBEGIN和MEND分别为'short'、3和7,而match、mbegin和mend是单个条目数组,其中包含字符串'hor'、'4'和'6'。
如果设置了BASH_REMATCH选项,则数组BASH_REMATCH设置为与模式匹配的子字符串,后跟匹配模式内的括号子表达式的子字符串。
if [[ $match[1]="somestring" ]]
?$match花括号会引发语法错误。 - MaxRocketif [[ $match[1] == "something" ]]
。 - Meng Lu