LINUX.ORG.RU

Bash, hex 4 знака

 ,


0

1

Доброго времени суток, подскажите, как на bash вот такое:

05.4f0.017

012.801c.6372

превратить в вот такое:

0005.4f00.0017

0012.801c.6372

?

Тоесть, каждый октет в hex должен быть 4 знака.

★★

Последнее исправление: nixit (всего исправлений: 1)

4 знака

«Два знака» вы хотели сказать?

Zmicier ★★★★★
()
Ответ на: комментарий от mittorn

Хотя да, вы правы, по иному быть не может.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Скорее всего опечатка, но я этим предлагал ему использовать printf для форматирования. А разбить на точки можно через cut.

mittorn ★★★★★
()

У меня это выгдядело бы примерно так:

while read line; do printf %04x.%04x.%04x\\n 0x`echo $line|cut -d . -f1` 0x`echo $line|cut -d . -f2` 0x`echo $line|cut -d . -f3`; done

while read line; do printf %04x.%04x.%04x\\n 0x`echo $line|cut -d . -f1` 0x`echo $line|cut -d . -f2` 0x`echo $line|cut -d . -f3`; done
05.4f0.017
0005.04f0.0017
012.801c.6372
0012.801c.6372

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 3)
Ответ на: комментарий от mittorn
( IFS=.
set -- $(echo 05.4f0.017)
printf %04x\\n $(printf 0x%s. "$@") | paste -sd .
)
anonymous
()
Ответ на: комментарий от mittorn

А разбить на точки можно через cut.

В Баше нет cut.

Zmicier ★★★★★
()
Ответ на: комментарий от mittorn

printf %04x.%04x.%04x\\n 0x`echo $line|cut -d . -f1` 0x`echo $line|cut -d . -f2` 0x`echo $line|cut -d . -f3`

Ужс.

$ IFS='.' read a b c <<< '05.4f0.017'
$ printf '%04x.%04x.%04x\n' "0x$a" "0x$b" "0x$c"
0005.04f0.0017
Zmicier ★★★★★
()
Ответ на: комментарий от mittorn

ведь у printf на входе числа, а не текст

В Баше нет процедур, у которых в аргументах числа. Даже у let строка.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)

Вот это:

05.4f0.017

Вот в это:

0005.4f00.0017

Не преобразуется в принципе. Поправьте первое сообщение.

DRVTiny ★★★★★
()
Ответ на: комментарий от Zmicier

Перепиши свой код так чтобы он читал строки из stdin и писал в stdout.
Потребуется двойной цикл, верно? А у меня его нет.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Перепиши свой код так чтобы он читал строки из stdin

А это зачем? Ну будет read.

Потребуется двойной цикл, верно? А у меня его нет.

Угу, поменяем вложенные цикл на пайп с внещней утилито в цикле.

Вот вам даже без printf

read xx
IFS=.
prev=
for x in $xx; do
        while [ ${#x} -lt 4 ]; do
                x="0$x"
        done
        echo -n "$prev$x"
        prev=.
done
echo
vodz ★★★★★
()
Ответ на: комментарий от mittorn

Перепиши свой код так чтобы он читал строки из stdin и писал в stdout.

IFS='.' read a b c
printf '%04x.%04x.%04x\n' "0x$a" "0x$b" "0x$c"
Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.