문자열의 두 번째 점을 제거하고 문자 사이에 0을 추가합니다.

문자열의 두 번째 점을 제거하고 문자 사이에 0을 추가합니다.

변수(XYZ)에 의미 체계 버전 문자열이 있습니다. 두 번째 점이 사라지고 Z에 숫자가 한 개만 있는 경우 Y와 Z를 0으로 구분하여 연결하거나 Z에 숫자가 두 개 있는 경우 직접 연결하도록 이를 변경해야 합니다.

기본적으로 다음과 같이 진행됩니다.

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를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

을 포함한 모든 POSIX 셸에서 및 ksh 연산자를 bash사용합니다 .${var##pattern}${var%pattern}

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

답변2

매개변수 확장을 사용합니다.

#!/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

답변3

Bash에서는 read분할과 printf제로 패딩을 사용하세요. 변수를 통한 입력 old및 출력 new(일부 임시 변수 사용 비용):

old=1.4.24
IFS=. read -r a b c  <<< "$old"
printf -v new "%s.%s%02d" "$a" "$b" "$c"
echo "$old -> $new"

그게 인쇄되어야 해1.4.24 -> 1.424

답변4

짧은awk해결책:

테스트 사례:

ver_num="1.4.10"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.410

ver_num="1.5.0"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.500

ver_num="1.4.77"
awk -F'.' '{ printf "%d.%d%.2d", $1, $2, $3 }' <<<"$ver_num"
1.477

관련 정보