bash 中的正则表达式提取第一个分隔符后的字符串

bash 中的正则表达式提取第一个分隔符后的字符串

这个问题与这里的任何其他问题都不重复,因为我regex需要bash匹配=~

假设我有一个像这样的字符串

string="ananas1kiwi2apple1banana2tree"

regEx尝试的是

[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}

它应该匹配 的出现2并捕获除此之外的所有内容,它仅返回我tree(第二次匹配后的字符串)。我的预期输出是apple1banana2tree

我知道缺少一个简单的构造,但不确定是哪个。我只寻找bash regEx基于纯的解决方案。我知道也没有任何字符串操作可以通过"{string#*2}"

答案1

只需匹配2,然后通过以下方式捕获之外的所有内容.*

[[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"

例子:

$ string="ananas1kiwi2apple1banana2tree"

$ [[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
apple1banana2tree

你的有什么问题:

  • .*2是贪婪的,当您使用 时,它会匹配到最后一个.*2,以具有非贪婪性(.*?在 ERE 中不可用)使用[^2]*2

  • {1,}只是+

所以这样做:

[[ $string =~ [^2]*2([[:alnum:]]+) ]]

无论如何,不​​需要从一开始就匹配,只需执行以下操作:

[[ $string =~ 2([[:alnum:]]+) ]]

相关内容