我正在努力檢查我的字串是否與百分比模式匹配,即任何非空格(或制表符、新行)字符重復多次,最后是一個百分比符號。
這應該很容易,但我正在嘗試:
third_col="88.90%"
if [[ $third_col == '. %' ]]; then
echo "matches"
fi
而且它不輸出“匹配”。我想知道正則運算式的哪個部分是錯誤的。
uj5u.com熱心網友回復:
任何非空格(或制表符、換行符)字符重復多次,并在末尾有一個百分號
這是使用的非正則運算式方式extglob:
([![:blank:]])%
匹配 1 個或多個非空白字符,后跟%.
代碼:
for s in '88.90%' '81.4' '5 1%' '' ' %' 'abc%'; do
[[ $s == ([![:blank:]])% ]] && echo "'$s' ok" || echo "'$s' no"
done
'88.90%' ok
'81.4' no
'5 1%' no
'' no
' %' no
'abc%' ok
感謝下面的評論。如果您使用的是 bash 版本 < 4.1,則extglob在運行此腳本之前啟用:
shopt -s extglob
uj5u.com熱心網友回復:
如果您想匹配任何一個或多個非空白字符和 a%結尾,您需要使用正則運算式(使用=~運算子啟用),而不是 glob 模式(==使用 glob 模式匹配),并且模式應該類似于^[^[:space:]] %$:
#!/bin/bash
third_col="88.90%"
rx='^[^[:space:]] %$'
if [[ "$third_col" =~ $rx ]]; then
echo "matches"
fi
請參閱在線演示。在這里,[^[:space:]] 匹配一個或多個非空白字符。
更精確的模式將是
rx='^[0-9] (\.[0-9] )?%$'
請參閱此在線演示。詳情:
^- 字串的開始[0-9]- 一位或多位數字(\.[0-9] )?- a.和一個或多個數字的可選序列%- 一個%字符$- 字串結束。
uj5u.com熱心網友回復:
標準case陳述句可以做到這一點:
third_col=88.90%
case $third_col in
*[[:space:]]*) ;;
?*%) echo matches ;;
esac
如果 中有任何空格$third_col,則什么也不做。否則,如果它以“%”結尾,echo matches.
您可以擴展第一個模式以拒絕其他無效案例,例如:
third_col=88.90%
case $third_col in
*[!%.0123456789]* | *%*%* | *.*.* | '' | %) ;;
?*%) echo matches ;;
esac
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408157.html
標籤:
