Как после каждого 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