Use*_*123 1 bash regular-expression case pattern-matching
我想在case
语句中匹配一个版本号。版本号可能如下所示
1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)
并存储在一个 shell 变量中:version
.
正如我在互联网上搜索的那样,在 -case
语句中匹配正则表达式并不困难。但是,有没有人有想法或可以帮助说明如何在case
-statement 中完成?
我尝试了以下方法,但没有奏效:
1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)
case
仅支持 shell 模式,不支持正则表达式。但是 Bash 支持开箱即用的具有不同语法的正则表达式。
如果您的意思是“由点分隔的任意数量的十进制数字”,并且例如没有尾随字母或标签,那么该模式^[0-9]+(\.[0-9]+)*$
可能是合适的。([0-9]+\.*)+
还将匹配带有连续点或尾随点的字符串,例如1.2..3.
. 所以:
#!/bin/bash
re='^[0-9]+(\.[0-9]+)*$';
if [[ $version =~ $re ]]; then
echo "'$version' matches the pattern"
else
echo "'$version' doesn't match"
fi
Run Code Online (Sandbox Code Playgroud)
正则表达式表示要查找任意数量的十进制数字 ( [0-9]+
),然后是任意数量的组 ( (·)*
) ,这些组 ( ) 由文字点 ( \.
) 和任意数量的十进制数字 ( [0-9]+
) 组成。^
并将$
模式锁定到字符串的开头和结尾,否则匹配的子字符串就足以进行匹配。
这将允许没有任何点的版本字符串,例如123
. 如果您想至少需要两个数字和点,请使用^[0-9]+(\.[0-9]+)+$
(将最后*
一个更改为 a +
)。
请注意,根据区域设置,[0-9]
匹配的内容可能有点令人惊讶,它可能包含一些更奇怪的 Unicode 数字。拼出允许的字符 with[0123456789]
会更严格,但写起来更笨拙且容易出错。
case
匹配 shell 模式,而不是正则表达式。因此,^[0-9]+(\.[0-9]+)*$
您可以使用以下正则表达式代替:
case $version in
'' | *[!0123456789.]* | .* | *. | *..* ) echo invalid;;
* ) echo fine;;
esac
Run Code Online (Sandbox Code Playgroud)
即“反转”匹配意义,使用标准外壳模式来检测无效情况。
请注意,extglob
bash 选项适用于匹配 incase
语句。因此,如果您设置了shopt -s extglob
,那么那些扩展模式(如+()
、*()
等)将获得它们的特殊含义,并且您可以通过使用+([0123456789])*(.+([0123456789]))
(外壳模式已经“锚定”到开头和结尾)来进行更像正则表达式的正匹配。
归档时间: |
|
查看次数: |
317 次 |
最近记录: |