Bash

刪除字元串的第二個點並在字元之間放置一個 0

  • March 21, 2018

我在變數(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

引用自:https://unix.stackexchange.com/questions/432585