2

bashスクリプトとsedを使用してs51シミュレーターの出力を解析しようとしています。最初のステップでは、16進形式のすべてのバイトを含む単一の文字列が必要です。シミュレータの出力は次のようになります。実際の出力ははるかに長く、最大64kになる可能性があります。

0x0000 10 11 12 13 14 15 16 17 ........
0x0008 18 19 00 00 00 00 00 00 ........
0x0010 00 00 00 00 00 00 00 00 ........
0x0018 00 00 00 00 00 00 00 00 ........
0x0020 00 00 00 00 00 00 00 00 ........
0x0028 00 00 00 00 00 00 00 00 ........
0x0030 00 00 00 00 00 00 00 00 ........
timer #0("time") ON: 0.001085 sec (13020 clks)
timer #0("isr") ON,ISR: 0 sec (0 clks)
timer #0("idle") ON,ISR: 0 sec (0 clks)

解析するコードは次のとおりです。

sed -e ':loop' -e 's/\s\([0-9a-f]\{1\}\)\([0-9a-f]\{1\}\)/\2\1/g' -e 't loop' -n -e 's/.*\(0x[0-9a-f]\{4\}\)\([0-9a-f]\{16\}\).*/\2/p' | sed -e ':a;N;$!ba;s/\n//g'

最初の3つの部分は、各バイトの2桁を交換し、スペースを削除します。4番目の部分は、他の行とアドレスおよびASCII表現を削除します。最後の部分は、線を接続する接続を削除します。

これにより、次のような文字列が出力されます。

01112131415161718190000000....

何がもっと上手くできるのだろうと思っていました。

4

4 に答える 4

2

以下は同等であるべきだと思います:

sed -n -e '/^0x[0-9a-f]\{4\}/H' -e '${x;s/\n\S*//g;s/\s\.\.*//g;s/\s\([0-9a-f]\)\([0-9a-f]\)/\2\1/g;p}'

または、 のバージョンが でsedコマンドを区切ることをサポートしていない場合;:

sed -n -e '/^0x[0-9a-f]\{4\}/H' -e '${x
s/\n\S*//g
s/\s\.\.*//g
s/\s\([0-9a-f]\)\([0-9a-f]\)/\2\1/g
p
}'

これは、各バイト行をホールド スペースに追加することで機能し、ファイルの最後の行に到達したら、ホールド スペースとパターン スペースを交換して一度にすべて処理します。次に、各行の先頭から改行とアドレスを削除し、末尾のドットを削除し (実際の出力によっては、これは実際には必要ないかもしれません)、最後に各バイトの数字を交換して出力します。

于 2012-09-18T18:02:30.050 に答える
2

これはうまくいくかもしれません(GNU sed):

sed '/^0x\S\{4\}\(\( \S\S\)\{8\}\).*/{s//\1/;H};$!d;x;s/\n//g;s/ \(.\)\(.\)/\2\1/g' file

または(ピンチで):

sed -r '/^0x....(( ..){8}).*/{s//\1/;H};$!d;x;s/\n//g;s/ (.)(.)/\2\1/g' file
于 2012-09-19T06:16:35.330 に答える
0

実行している Linux のバージョンに応じて、odまたはのようなツールがありhexdump、これに役立ちます。hexdump何バイトがどのようにフォーマットされるかなどを制御するために、一種のミニスクリプト言語を使用して高度に構成することさえできます...

于 2012-09-18T20:43:34.497 に答える
0

を使用した片道GNU awk

awk '/^0x/ { for (i=2; i<=NF; i++) { gsub(/[^0-9]/,"", $i); line=line $i } } END { printf "%s\n", substr(line,2) }' file.txt
于 2012-09-18T23:24:56.387 に答える