다음과 같은 텍스트가 있습니다.
;---------------------------------------
JOURNEY_ARRAY_01
.BYTE <JOURNEY_00
.BYTE <JOURNEY_01
;---------------------------------------
JOURNEY_ARRAY_03
.BYTE JOURNEY_01-JOURNEY_00
.BYTE JOURNEY_02-JOURNEY_01
;---------------------------------------
JOURNEY_00 ; From 00 to 01
.BYTE $01, $01, $01, $03, $01, $01, $03, $01
.BYTE $03, $01, $03, $01, $03, $01, $03, $01
.BYTE $03, $03, $01, $03, $03, $03, $03, $00
.BYTE $03, $03, $00, $03, $00, $03, $00, $03
.BYTE $00, $03, $00, $03, $03, $00, $03, $03
.BYTE $00, $03, $03, $03, $03, $03, $03, $01
.BYTE $03, $03, $01, $03, $03, $01, $03
;---------------------------------------
JOURNEY_01 ; From 00 to 04
.BYTE $01, $01, $01, $03, $01, $01, $03, $01
.BYTE $03, $01, $03, $01, $03, $01, $03, $01
.BYTE $03, $03, $01, $03, $01, $03, $01, $01
.BYTE $03, $01, $03, $01, $01, $01, $01, $01
.BYTE $02, $01, $01, $01, $02, $01, $01, $01
.BYTE $02, $01, $01, $01, $01, $01, $01, $01
.BYTE $01, $01, $01
;---------------------------------------
".BYTE" 뒤에 있는 모든 숫자 값을 가져와서 4개 값마다 다음을 수행해야 합니다. - 첫 번째 값에는 아무 작업도 수행하지 않습니다. - 두 번째 값에 *4를 곱합니다. - 네 번째 값에 *16을 곱합니다. 값에 *64를 곱합니다. 4개의 값이 함께 추가되고 결과는 4개의 원래 값 대신 "$"가 앞에 붙는 16진수 형식으로 표시됩니다. ".BYTE" 뒤의 값이 4의 배수가 아니거나 4보다 작은 경우 누락된 값은 0으로 계산되어야 합니다. 예를 들어:
.BYTE $01, $01, $01, $03, $01, $01, $03, $01
다음과 같아야 합니다:
.BYTE $57, 5D
왜냐하면:
03*1 = 3 +
01*4 = 4 +
01*16 = 16 +
01*64 = 64 = 87 = $57
and
01*1 = 1 +
03*4 = 12 +
01*16 = 16 +
01*64 = 64 = 93 = $5D
나타나지 않는 값은 수학에서 0으로 평가해야 하는데...물론 다른 텍스트는 변경하면 안 됩니다.
누구나?
답변1
다음 sed
플러스 gawk
(GNU awk) 솔루션은 요청된 작업을 수행합니다.
sed -e '/ .BYTE/{s/\$/0x/g;s/,//g}' INPUTFILE.txt |
gawk --non-decimal-data '/.BYTE.*0x/{ printf ".BYTE $%x, $%x\n",
($5+$4*4+$3*16+$2*64 ) , ($9+$8*4+$7*16+$6*64) };!/.BYTE.*0x/{print}'
이 호출은 쉼표를 sed
대체 하고 수정이 필요한 줄에서 쉼표를 제거합니다 . 그런 다음 awk 호출은 16진수를 식별하고 계산을 수행하며 해당 행에 결과를 인쇄합니다. 다른 줄은 단순히 출력에 복사됩니다.$01
0x01
.BYTE
.BYTE
패턴은 주어진 예에서 작동하지만 다른 라인 형식을 사용하는 경우 수정이 필요할 수 있습니다.
이 명령은 한 줄에 숫자 4개의 블록이 정확히 두 개 있다고 가정합니다. 따라서 입력의 마지막 줄을 출력합니다.
.BYTE $54, $0