Bash
刪除字元串的第二個點並在字元之間放置一個 0
我在變數(XYZ)中有語義版本控製字元串。我需要改變它,以便第二個點消失,如果 Z 只有一位數字,或者如果 Z 有兩位數字,我將 Y 和 Z 連接起來,用 0 分隔。
所以基本上是這樣的:
1.5.0 -> 1.500 1.5.1 -> 1.501 1.4.7 -> 1.407 1.4.10 -> 1.410 1.4.24 -> 1.424
我怎麼能用 bash 做到這一點?
在任何 POSIX shell 中,包括
bash
,使用${var##pattern}
和${var%pattern}
ksh 運算符:case $string in (*.*.*) minor=${string##*.} case $minor in (? | "") minor=0$minor esac string=${string%.*}$minor esac
特別是使用 bash-3.2+(並且未啟用 bash 3.1 兼容性),您還可以執行以下操作:
if [[ $string =~ ^(.*\..*)\.([^.]*)([^.])$ ]]; then string=${BASH_REMATCH[1]}${BASH_REMATCH[2]:-0}${BASH_REMATCH[3]} fi
使用參數擴展。
#!/bin/bash declare -A expect=( [1.5.0]=1.500 [1.5.1]=1.501 [1.4.7]=1.407 [1.4.10]=1.410 [1.4.24]=1.424 ) new_version() { prefix=${1%%.*} suffix=${1##*.} middle=${1#*.} middle=${middle%.*} printf %s.%s%02d "$prefix" "$middle" "$suffix" } for old in "${!expect[@]}" ; do new=$(new_version $old) if [[ ${expect[$old]} == $new ]] ; then echo ok else echo not ok: in: $old expect: ${expect[$old]} got: $new fi done