Это старый вопрос, и когда вы понимаете, что это надуманный пример (и, следовательно, правильным решением будет использование 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)
В любой оболочке 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
Использовать расширение параметра.
#!/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
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" )
Краткое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
В 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