Remove o segundo ponto de uma string e coloca 0 entre os caracteres

1

Eu tenho uma string de versão semântica em uma variável (X.Y.Z). Eu preciso mudar isso, de modo que o segundo ponto desapareça e eu concateno Y e Z separados por um 0 se Z for apenas um dígito, ou diretamente se Z tiver dois dígitos.

Então basicamente algo assim:

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

Como eu poderia fazer isso usando o bash?

    
por theJuls 21.03.2018 / 14:42

5 respostas

3

Em qualquer shell POSIX, incluindo bash , usando os operadores ${var##pattern} e ${var%pattern} ksh:

case $string in
  (*.*.*)
     minor=${string##*.}
     case $minor in
       (? | "") minor=0$minor
     esac
     string=${string%.*}$minor
esac

Com o bash-3.2 + especificamente (e com a compatibilidade do bash 3.1 não ativada), você também pode fazer:

if [[ $string =~ ^(.*\..*)\.([^.]*)([^.])$ ]]; then
  string=${BASH_REMATCH[1]}${BASH_REMATCH[2]:-0}${BASH_REMATCH[3]}
fi
    
por 21.03.2018 / 14:49
2

Use a expansão de parâmetros.

#!/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
    
por 21.03.2018 / 14:55
1

No Bash, usando read para dividir e printf para preenchimento zero. Com entrada da variável old e saída para new (com o custo de usar algumas variáveis temporárias):

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

Isso deve imprimir 1.4.24 -> 1.424

    
por 21.03.2018 / 15:02
1
v=1.5.1
( set -f; IFS=. split=( $v )
if [ ${#split[2]} -eq 1 ]
then 
  nv=${split[0]}.${split[1]}0${split[2]}
else
  nv=${split[0]}.${split[1]}${split[2]}
fi
printf "$nv" )
    
por 21.03.2018 / 14:55
0

Solução awk curta:

Casos de teste:

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
    
por 21.03.2018 / 14:56