Удалить вторую точку строки и поставить 0 между символами

Это старый вопрос, и когда вы понимаете, что это надуманный пример (и, следовательно, правильным решением будет использование cat | или вообще никакого cat в этом case), я просто отправлю свой ответ для общего случая. Я бы решил это, поместив его в функцию и используя вместо этого.

fmt-func() {
    fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
}

, а затем используйте это

cat <(fmt-func)
1
21.03.2018, 16:03
5 ответов

В любой оболочке POSIX, включая 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
3
27.01.2020, 23:12

Использовать расширение параметра.

#!/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
2
27.01.2020, 23:12
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" )
1
27.01.2020, 23:12

Краткое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
0
27.01.2020, 23:12

В 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

1
27.01.2020, 23:12

Теги

Похожие вопросы