문제가 있습니다. 다음 내용이 포함된 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_base64
Perl 모듈에서 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
교체 시 위 명령을 수행하는 것입니다 .sed
printf
$ 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