0

我正在尝试检查字符串是否采用以下格式:(X,Y,Z) 其中 -99<=X,Y,Z<=99。

由于某种奇怪的原因,以下内容不起作用:

if [[ "${line}" == "("[-99-99],[-99-99],[-99-99]")" ]];
    then echo "nice point"
fi

我错过了什么?

4

4 回答 4

4

这应该有效:

if [[ $line =~ ^\(-?[0-9]{1,2},-?[0-9]{1,2},-?[0-9]{1,2}\)$ ]]; then
    echo "nice point"
fi
于 2013-09-02T12:58:19.277 回答
1

您的代码将 的内容${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 中检查。

于 2013-09-02T12:51:24.420 回答
1

以下正则表达式应该在bash. 它检查前面有可选负号的 2 位数字。数字可以用可选空格分隔。

twodigitnum="-?[[:digit:]]{1,2}"
regex="^\($twodigitnum, *$twodigitnum, *$twodigitnum\)$"
if [[ $line =~ $regex ]]; then
    echo "nice point"
fi
于 2013-09-02T12:58:27.370 回答
0

[ 和 ] 匹配一组字符,而不是数字范围。所以 [-99-99] 并不像你想的那样——它只匹配两个字符“-”和“9”。

在 bash 中,您可以使用扩展的通配符来匹配它,如下所示:

[[ "${line}" == "("?(-)+([0-9]),?(-)+([0-9]),?(-)+([0-9])")" ]]

...允许任意数量的数字,如有必要,您可以对其进行微调。

于 2013-09-02T12:51:36.637 回答