[英]Regex to match the end of line
我正在尋找BASH正則表達式從下面的命令中拉出'db'agruments。 但是,不保證參數的順序。 出於某種原因,我無法讓它完全發揮作用。
到目前為止我有什么
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"
關於正則表達式的任何建議?
問題是bash
使用的是一種不包含非貪婪重復運算符( *?
, +?
)的regex
。 因為*
是貪婪的並且沒有辦法告訴它不貪婪,所以第一個帶括號的子表達式( (.*)
)匹配到行尾的所有內容。
如果您知道要捕獲的值不包含特定字符並替換,則可以解決此問題.
使用排除該字符的字符類。
例如,如果--db
之后的值不包含破折號( -
),則可以使用此regex
:
regex='--db ([^-]*)($| --)'
它匹配問題中發布的所有示例。
以下作品:
regex="--db[[:space:]]([[:alnum:][:space:]]+)([[:space:]]--|$)"
[[ "$@" =~ $regex ]]
有兩個問題:
(.*)
是貪婪的,並會盡可能的去最后--
字面。 由於bash不支持非貪婪匹配,我們必須使用[[:alnum:][:space:]]
匹配,這將保證我們在下一個停止--
。 我想你想匹配非空格字符來捕捉第一個分組:
regex="--db (\S+)( --|$)"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.