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

Автор решения: aleksandr barakin

например, можно воспользоваться встроенной в программу 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 или в википедии

→ Ссылка
Автор решения: Ivan

Как вариант:

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
→ Ссылка
Автор решения: arhat

но уперся в то, что он ставить точку после 3 символов спереди, а не сзади

для исправления можно просто использовать утилиту rev которая записывает строку в обратном порядке

$ echo "1000000" | rev | sed -e "s/.\{3\}/&\./g" | rev
1.000.000
→ Ссылка