正确的正则表达式在 Bash 中不起作用

正确的正则表达式在 Bash 中不起作用

我的问题也许可以通过其他方式解决,但我不禁想知道为什么使用正则表达式不起作用。

代码

#!/bin/bash
python_version=$(python3 --version)
regexp='(?<=^Python )3\.[0-9]+'
[[ $python_version =~ $regexp ]]
echo $BASH_REMATCH

例如,3.8对于python版本应该产生结果。当我在3.8.10regex101.com。但当我把它插入时bash,它什么也没发生。

我应该注意,在这个测试用例中,这$python_version等于。Python 3.8.10

我真的很想知道如何bash仅使用来解决这个特殊问题。

我在用着Ubuntu 20.04

答案1

正向后视 ( (?<=…)) 在 使用的 POSIX ERE 中不起作用[[ … =~ … ]]

在您的用例中,您可以匹配更广泛的模式,然后删除多余的部分:

#!/bin/bash
python_version=$(python3 --version)
regexp='^Python 3\.[0-9]+'
[[ $python_version =~ $regexp ]]
echo "${BASH_REMATCH#Python }"

请注意,这种方法不适用于任意正则表达式,而不是你的^Python。在${var#pattern}模式中就像文件名生成模式,不是正则表达式。 看这是我的另一个答案

相关内容