我有一個來自 bash 的值數組,我只想檢查其中是否有數字。它可以在開頭或結尾包含-
,+
數字和空格,因為 bash 將其評估為 sting。
由於每個數字都,
在末尾表示,因此我將其添加(,)
到正則表達式中。
基本上我想檢查元素是否是數字。
的$val
樣子這些。
[ [ -0.13450142741203308, -0.3073260486125946, -0.15199440717697144, -0.06535257399082184, 0.02075939252972603, 0.03708624839782715, 0.04876817390322685 ] ,[ 0.10357733070850372, 0.048686813563108444, -0.1413831114768982, -0.11497996747493744, -0.08910851925611496, -0.04536910727620125, 0.06921301782131195, 0.02547631226480007 ] ]
這是我的代碼,它查看每個值並評估每個值。然而,它似乎沒有抓住這些案例。
re='^[[:space:]][+-]?[0-9]+([.][0-9]+)?(,)[[:space:]]$'
for j in ${val[*]}
do
if ! [[ "$j" =~ $re ]] ; then
echo "Error: Not a number: $j"
fi
done
它還需要忽略 throw[
或]
or 的情況],
。
任何想法如何糾正這個?謝謝您的幫助。
它很可能$val
以字符串的形式出現在您身上。
如果您不需要將每個數字驗證為完全合法的數字,您可以使用 shell 邏輯來過濾那些明顯不是數字的東西:
val='[ [ -0.13450142741203308, -0.3073260486125946, -0.15199440717697144, -0.06535257399082184, 0.02075939252972603, 0.03708624839782715, 0.04876817390322685 ] ,[ 0.10357733070850372, 0.048686813563108444, -0.1413831114768982, -0.11497996747493744, -0.08910851925611496, -0.04536910727620125, 0.06921301782131195, 0.02547631226480007 ] ]'
for e in $val; do # PURPOSELY no quote to break on spaces
e="${e/,}"
case $e in
''|*[!0-9.\-]*) printf "'%s' is bad\n" "$e" ;;
*) printf "'%s' is good\n" "$e" ;;
esac
done
印刷:
'[' is bad
'[' is bad
'-0.13450142741203308' is good
'-0.3073260486125946' is good
'-0.15199440717697144' is good
'-0.06535257399082184' is good
'0.02075939252972603' is good
'0.03708624839782715' is good
'0.04876817390322685' is good
']' is bad
'[' is bad
'0.10357733070850372' is good
'0.048686813563108444' is good
'-0.1413831114768982' is good
'-0.11497996747493744' is good
'-0.08910851925611496' is good
'-0.04536910727620125' is good
'0.06921301782131195' is good
'0.02547631226480007' is good
']' is bad
']' is bad
這是超快的,但會在格式錯誤的“數字”上失敗,例如 123-456
如果您確實需要過濾掉格式錯誤的數字,您可以使用awk
:
echo "$val" | awk -v RS="[^0-9.+-]+" '($0+0==$0)'
# all legit numbers from the string...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句