Как после каждого 3 символа с конца ставить точку bash
Надо чтобы Bash выводил 1.000.000
вместо 1000000
, и 123.334
вместо 123334
. Я попытался сделать, но уперся в то, что он ставить точку после 3 символов спереди, а не сзади
test=1000000
echo $test | sed -e "s/.\{3\}/&\./g"
Bash выводит 100.000.0
вместо 1.000.000
.
Ответы (3 шт):
например, можно воспользоваться встроенной в программу bash функцией printf
(либо почти идентичной программой /usr/bin/printf
, обычно из пакета coreutils
или аналогичного по смыслу), в которой есть поддержка разделителей групп разрядов, специфичных для разных локалей:
$ LC_NUMERIC=ru_RU.UTF-8 printf "%'d\n" 12345678
12 345 678
$ LC_NUMERIC=en_US.UTF-8 printf "%'d\n" 12345678
12,345,678
доп. чтение: форматы, используемые в printf()
- $ man 3 printf
или в википедии
Как вариант:
split(){
local tst=$1 new
while ((${#tst}>3)); do
new=${tst:(-3)}.$new
tst=${tst::(-3)}
done; tst=$tst.$new
echo ${tst%.}
}
тест:
$ split 123
123
$ split 1234
1.234
$ split 12345
12.345
$ split 123456
123.456
$ split 1234567
1.234.567
$ split 12345678
12.345.678
$ split 123456789
123.456.789
$ split 1234567890
1.234.567.890
но уперся в то, что он ставить точку после 3 символов спереди, а не сзади
для исправления можно просто использовать утилиту rev
которая записывает строку в обратном порядке
$ echo "1000000" | rev | sed -e "s/.\{3\}/&\./g" | rev
1.000.000