次のテキストがあります。
;---------------------------------------
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つの値ごとに次のことを行う必要があります。 - 最初の値には何もしません。 - 2番目の値に* 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
表示されない値は数学でゼロと評価する必要があります...もちろん、他のテキストは変更しないでください。
誰でも?
答え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
パターンは与えられた例で動作しますが、他の行形式を使用する場合は修正が必要になる場合があります。
このコマンドは、1行に4つの数字のブロックが正確に2つあると仮定します。したがって、入力の最後の行を出力します。
.BYTE $54, $0