1文字フィールドを2文字(0で埋められる)に拡張するには、正規表現の助けが必要です。 0-9、英数字フィールド。
一方:
echo $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:
拡張:
00:5b:00:09:40:00:64:ff:9b:00:01:00:03:00:59:00:17:00:0a:20:47:55:54:4c:36:26:00:6c:e1:80:e0:00:00:5d:00:04:01:00:00:00:
次にコロン(:
)を削除します。
updatedstring = ${dhcp6_s46_cont_mapt//:}
echo $updatedstring
005b0009400064ff9b000100 ... etc
私は答えが次のようになるべきだと思います: 's/ ([a-f0-9][a-f0-9][:])'|'s/([a-f0-9][:]) / 0 \1 /' < $dhcp6_s46_cont_mapt - 拡張検索に使用されます。
答え1
すべてを(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
答え2
POSIXsh
構文を使用します。
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
)
答え3
16進数のsed
文字クラスのみを使用すると、[[:xdigit:]]
次のことができます。
sed -E ':a s/(^|:)([[:xdigit:]])(:|$)/\10\2\3/; ta; s/://g'
[[:xdigit:]]
一致(0-9a-f、大文字と小文字を区別しない)
答え4
すべてのUNIXシステムのすべてのシェルでawkを使用します。
$ 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
それ以外の場合は、EREを有効にする必要があるsedを使用してください-E
。
$ 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