Unix의 파일에서 base64 값 바꾸기

Unix의 파일에서 base64 값 바꾸기

문제가 있습니다. 다음 내용이 포함된 test.txt 파일이 있습니다.

objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: U1RQJgAkQiE=
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

IMEISV:: 텍스트가 발견될 때마다 해당 파일에서 IMEISV::(이 경우 U1RQJgAkQiE=) 뒤의 값을 다음 함수의 결과로 바꾸고 싶습니다.

base64 -d | od -t x8 -An | rev

유닉스에서 이 작업을 수행하면 에코는 다음과 같습니다.

echo U1RQJgAkQiE= | base64 -d | od -t x8 -An | rev

결과는 3545056200422412입니다.

따라서 파일 끝의 U1RQJgAkQiE= 값은 3545056200422412여야 합니다. 다음과 같이:

objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: 3545056200422412
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

누군가 sed/perl을 사용하여 이 작업을 수행하는 방법을 알려주실 수 있습니까? 저는 정말 유닉스 초보자입니다

답변1

어때요?

unpack("h*", decode_base64($_))

이는 decode_base64Perl 모듈에서 MIME제공 됩니다. 예를 들면 다음과 같습니다.

$ perl -MMIME::Base64 -pe 's/IMEISV:: \K(.*)$/unpack("h*", decode_base64($1))/e' test.txt
objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: 3545056200422412
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

답변2

sed 's/\(IMEISV::\)\(.*\)/echo -n \1" ";echo \2\| base64 -d \| od -t x8 -An\|rev /ge ' input.txt

비결은 e 스위치입니다. 산출:

objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: 3545056200422412 
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

답변3

한 가지 아이디어 는 줄 바꿈 없이 일치하는 첫 번째 그룹에 인쇄를 사용하여 sed교체 시 위 명령을 수행하는 것입니다 .sedprintf

$ sed "s/\(IMEISV::\)\(.*\)/printf '\1 ' ; echo \2 | base64 -d | od -t x8 -An | rev/e" input_file
objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: 3545056200422412
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

답변4

#------------------
#  base64 in sed
#------------------
set -u

#> format string printf
fmt='%s%s\n'

#> bit, sextet, & octet regex
bit='[01]'
sextet="${bit}{6}"
 octet="${bit}{8}"; byte=$octet

#> base64 charset
b64='/[:alnum:]+'
declare -a b64_chars=({A..Z} {a..z} {0..9} + /)

#> user-defined helper function(s)
oneLine() {
  # collapse stdin into one line
  paste -sd'\0' -
}

esc_rhs() {
  # make stdin pkuggable
  # on the rhs of a s///
  sed -e '
    s:[\/&]:\\&:g
    $!s:$:\\:
  ' -
}

dec2bin() {
  # create an array of size 2^$1
  # Usage: dec2bin 6
  # creates array d2b as:
  # underscore for clarity only
  # $d2b[0] => "000_000"
  # $d2b[1] => "000_001"
  #        ...
  # $d2b[63] => "111_111"

  eval "d2b=($(yes '{0,1}' | sed "$1q" | oneLine))"
}

#> build the encoding lookup table
encode_tbl=$(printf '%s\n' "$(
dec2bin 6
i=0
for c in "${b64_chars[@]}"
do
  printf "$fmt" "$c" "${d2b[$i]}"
  (( i++ ))
done
)" | esc_rhs)

#> build the decoding lookup table
decode_tbl=$(printf '%s\n' "$(
dec2bin 8
for dec in {0..255}
do
  hex=$(printf '%02x' "$dec")
  bin=${d2b[$dec]}
  printf "$fmt" "$bin" "$hex"
done
)" | esc_rhs)

#######> main()
sed -E "
  s/^IMEISV::\s*//;t base64
  b
  :base64
  s/[^${b64}]//g
  /^\$/d
  H;z;x;G

  s/\$/$encode_tbl/
  :encode
  /\n\n/!{
    s/((\n)[${b64}])(.*\1(${sextet}))/\4\2\3/
    b encode
  }

  s/\n.*//;:pad
  /^(${octet})+\$/!{
    s/\$/0/;b pad
  }
  # chunk it in 8-bit portions
  s/(${octet})/& /g
  G;s/\$/${decode_tbl}/;t decode
  :decode
    s/(${octet}) (.*\n\1([[:xdigit:]]{2}))/\3\2/
  t decode

  s/\n.*//
  s/([[:xdigit:]])([[:xdigit:]])/\2\1/g
  s/00?\$//
  s/^/IMEISV:: /
" file

관련 정보