SED/AWK/BASH расширяют поля с буквенно-цифровыми разделителями с заполнением «0»

После просмотра документации в Интернете о том, что такое hash, и поскольку у меня не было хэша для моего Debian-DVD, я загрузил свежий Debian-9.1-DVD.isoи проверил его хэш, выполнив sha512sum debian-9-dvd.isoи сравнив это к хэшу, заданному debian.org.
Поскольку они совпали, я начал устанавливать эту копию Debian, и она отлично работает.

0
16.10.2020, 21:43
5 ответов

Почему бы не хранить все в оболочке (bash )?

$ dhcp6_s46_cont_mapt='0:5b:0:9:40:0:64:ff:9b:0:1:0:3:0:59:0:17:0:a:20:47:55:54:4c:36:26:0:6c:e1:80:e0:0:0:5d:0:4:1:0:0:0:'

$ IFS=: read -a arr <<<"$dhcp6_s46_cont_mapt"    
$ printf -v updatedstring '%02x' "${arr[@]/#/0x}"

$ echo "$updatedstring"
005b0009400064ff9b0001000300590017000a204755544c3626006ce180e000005d000401000000
3
18.03.2021, 22:57

используя sedи символ -класс [[:xdigit:]]только для шестнадцатеричных цифр, вы можете сделать:

sed -E ':a s/(^|:)([[:xdigit:]])(:|$)/\10\2\3/; ta; s/://g'
  • [[:xdigit:]]совпадает с (0 -9a -f; без учета регистра)
0
18.03.2021, 22:57

Должно работать в busybox:

djunk=0:5b:0:9:40:0:64:ff:9b:0:1:0:3:0:59:0:17:0:a:20:47:55:54:4c:36:26:0:6c:e1:80:e0:0:0:5d:0:4:1:0:0:0:
djunk=$(djunk=:${djunk%:}; printf %02x ${djunk//:/ 0x})
echo "$djunk"

005b0009400064ff9b0001000300590017000a204755544c3626006ce180e000005d000401000000

Предполагая значение по умолчанию IFS, может быть легко исправлено (уточнение оставлено читателю в качестве упражнения)

0
18.03.2021, 22:57

С синтаксисом POSIX sh:

updatedstring=$(IFS=:; printf %02x $(printf 0x%s: $dhcp6_s46_cont_mapt))

Возможно, необычное применениеdd:

updatestring=$(
  printf %s "$dhcp6_s46_cont_mapt" |
    tr : '\n' |
    dd cbs=2 conv=block 2> /dev/null |
    tr ' ' 0
)
2
18.03.2021, 22:57

Использование любого awk в любой оболочке на каждом компьютере UNIX:

$ var='0:5b:0:9:40:a:b:64'
$ echo "$var" | awk 'BEGIN{FS=OFS=":"} {for (i=1;i<=NF;i++) $i=substr("0"$i,length($i))} 1'
00:5b:00:09:40:0a:0b:64

В противном случае использование sed с -Eдля включения ERE:

$ var='0:5b:0:9:40:a:b:64'
$ echo "$var" | sed -E 's/(^|:)([^:])(:|$)/\10\2\3/g; s/(^|:)([^:])(:|$)/\10\2\3/g; s/://g'
005b0009400a0b64

вот что происходит пошагово в скрипте sed:

$ echo "$var" | sed -E 's/(^|:)([^:])(:|$)/\10\2\3/g'
00:5b:00:9:40:0a:b:64

$ echo "$var" | sed -E 's/(^|:)([^:])(:|$)/\10\2\3/g; s/(^|:)([^:])(:|$)/\10\2\3/g'
00:5b:00:09:40:0a:0b:64

$ echo "$var" | sed -E 's/(^|:)([^:])(:|$)/\10\2\3/g; s/(^|:)([^:])(:|$)/\10\2\3/g; s/://g'
005b0009400a0b64
0
18.03.2021, 22:57

Теги

Похожие вопросы