我正在尝试检查字符串是否采用以下格式:(X,Y,Z) 其中 -99<=X,Y,Z<=99。
由于某种奇怪的原因,以下内容不起作用:
if [[ "${line}" == "("[-99-99],[-99-99],[-99-99]")" ]];
then echo "nice point"
fi
我错过了什么?
我正在尝试检查字符串是否采用以下格式:(X,Y,Z) 其中 -99<=X,Y,Z<=99。
由于某种奇怪的原因,以下内容不起作用:
if [[ "${line}" == "("[-99-99],[-99-99],[-99-99]")" ]];
then echo "nice point"
fi
我错过了什么?
这应该有效:
if [[ $line =~ ^\(-?[0-9]{1,2},-?[0-9]{1,2},-?[0-9]{1,2}\)$ ]]; then
echo "nice point"
fi
您的代码将 的内容${line}
与 glob 模式进行比较"("[-9],[-9],[-9]")"
。Glob 模式不是很强大,它们尤其不能比较数字范围。
我的解决方案是:
echo "${line}" | awk -F, '{
ok=0;
for(i=1; i<=NF; i++) {
v=$1;
if(-99 <= v && v <= 99) {ok++;}
}
if( ok != 3) { exit 1 }
} '
if [[ $? -eq 0 ]]; then
echo "nice point"
fi
-F,
告诉awk
以逗号分隔输入。然后循环遍历该行中的所有字段(= 每个值)。ok
对于 -99 到 99 之间的每个值,它都会递增。
如果ok
循环后不是 3,awk
则以非零退出代码退出。然后在 if 中检查。
以下正则表达式应该在bash
. 它检查前面有可选负号的 2 位数字。数字可以用可选空格分隔。
twodigitnum="-?[[:digit:]]{1,2}"
regex="^\($twodigitnum, *$twodigitnum, *$twodigitnum\)$"
if [[ $line =~ $regex ]]; then
echo "nice point"
fi
[ 和 ] 匹配一组字符,而不是数字范围。所以 [-99-99] 并不像你想的那样——它只匹配两个字符“-”和“9”。
在 bash 中,您可以使用扩展的通配符来匹配它,如下所示:
[[ "${line}" == "("?(-)+([0-9]),?(-)+([0-9]),?(-)+([0-9])")" ]]
...允许任意数量的数字,如有必要,您可以对其进行微调。