正则表达式匹配行尾

ste*_*eve 3 regex bash

我正在寻找 BASH 正则表达式来从以下命令中提取“db”参数。但是,不能保证参数的顺序。出于某种原因,我无法让它完全工作。

到目前为止我所拥有的

regex="--db (.*)($| --)"
[[ $@ =~ $regex ]]
DB_NAMES="${BASH_REMATCH[1]}"

# These are example lines
somecommand --db myDB --conf /var/home # should get "myDB"
somecommand --db myDB anotherDB manymoreDB --conf /home # should get "myDB anotherDB manymoreDB" 
somecommand --db myDB # should get "myDB"
somecommand --db myDB anotherDB # should get "myDB anotherDB"
Run Code Online (Sandbox Code Playgroud)

关于正则表达式的任何建议?

axi*_*iac 5

问题是bash使用了一种regex不包括非贪婪重复运算符 ( *?, +?)的风格。因为*is greedy 并且没有办法告诉它不贪婪,所以第一个带括号的子表达式 ( (.*)) 匹配到行尾的所有内容。

如果您知道要捕获的值不包含特定字符并替换.为排除该字符的字符类,则可以解决此问题。

例如,如果后面的值--db不包含破折号 ( -),您可以使用以下命令regex

regex='--db ([^-]*)($| --)'
Run Code Online (Sandbox Code Playgroud)

它匹配问题中发布的所有示例。