Ini*_*ian 5 shell bash regular-expression
这个问题与这里的任何其他问题都不重复,因为我regex需要bash匹配=~。
假设我有一个像这样的字符串
string="ananas1kiwi2apple1banana2tree"
Run Code Online (Sandbox Code Playgroud)
我regEx尝试的是
[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}
Run Code Online (Sandbox Code Playgroud)
它应该匹配 的出现2并捕获除此之外的所有内容,它仅返回我tree(第二次匹配后的字符串)。我的预期输出是apple1banana2tree
我知道缺少一个简单的构造,但不确定是哪个。我只寻找bash regEx基于纯的解决方案。我知道也没有任何字符串操作可以通过"{string#*2}"
只需匹配2,然后通过以下方式捕获之外的所有内容.*:
[[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
Run Code Online (Sandbox Code Playgroud)
例子:
$ string="ananas1kiwi2apple1banana2tree"
$ [[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
apple1banana2tree
Run Code Online (Sandbox Code Playgroud)
你的有什么问题:
.*2是贪婪的,当您使用 时,它会匹配到最后一个.*2,以具有非贪婪性(.*?在 ERE 中不可用)使用[^2]*2
也{1,}只是+
所以这样做:
[[ $string =~ [^2]*2([[:alnum:]]+) ]]
Run Code Online (Sandbox Code Playgroud)
无论如何,不需要从一开始就匹配,只需执行以下操作:
[[ $string =~ 2([[:alnum:]]+) ]]
Run Code Online (Sandbox Code Playgroud)