我的问题也许可以通过其他方式解决,但我不禁想知道为什么使用正则表达式不起作用。
代码
#!/bin/bash
python_version=$(python3 --version)
regexp='(?<=^Python )3\.[0-9]+'
[[ $python_version =~ $regexp ]]
echo $BASH_REMATCH
例如,3.8
对于python
版本应该产生结果。当我在3.8.10
regex101.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}
模式中就像文件名生成模式,不是正则表达式。 看这是我的另一个答案。