$BASH_REMATCH[]在zsh中的等效命令是什么?

18

$BASH_REMATCHzsh 中的等效物是什么,如何使用?

2个回答

21

或者,可以简单地使用

$match[1]

代替

$BASH_REMATCH[1]

你会如何在if语句中使用它们?例如,if [[ $match[1]="somestring" ]]?$match花括号会引发语法错误。 - MaxRocket
1
@MaxRocket:使用 if [[ $match[1] == "something" ]] - Meng Lu
哦,对了,我已经习惯了不用担心空格的问题,但在Shell脚本中这是至关重要的。 - MaxRocket

17
为了让zshbash的行为相同,请使用以下命令:
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设置为与模式匹配的子字符串,后跟匹配模式内的括号子表达式的子字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接