SED/AWK/BASH는 확장된 영숫자로 구분된 필드를 "0"으로 채웁니다.

SED/AWK/BASH는 확장된 영숫자로 구분된 필드를 "0"으로 채웁니다.

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

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
)

답변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

관련 정보