bashスクリプトを使用して、次のテキストファイルを処理したいと思います。
ADD $05 $05 $05
SUBI $06 $06 00011
MUL $07 $07 $07
JSR 011101
2進数(常に4桁より長い)を取得し、それを10進表現に変換します。
前の例で最終的に使用したいファイルは次のとおりです。
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29
私はナビゲートしてきましたが、tr
置き換えるsed
前に一致するパターンを使用することを許可していないようです(変換するため)。どうですか?
編集:@DopeGothiの提案に従って、1行に最大1つのバイナリがあることを考慮すると、バイナリのすべての10進数バージョンを含む一時ファイルを作成できます。問題は、これを挿入する必要があるということです。
最初のファイルでバイナリが見つかるたびに、ファイル内の対応する数値を10進数に置き換えます。
答え1
次の小さなbash
スクリプトを試してください。
while read -a INP; do for i in ${INP[@]}; do [[ "$i" =~ [^10] ]] || i=$((2#$i)); printf "%s\t" "$i" ; done; printf "\n"; done < file3
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29
わずかな研磨で利点を得ることができます。ファイルの行を配列として読み込み、その要素にバイナリ(0と1)のみが含まれているかどうかをテストし、2#
そうである場合は、印刷する前にデフォルトの2接頭辞を持つ「算術評価」を使用します。
答え2
pack
Perlのsumを使用するよりエレガントな方法があるかもしれませんが、unpack
文字列操作と次の組み合わせを使用することをお勧めしますoct
。
$ perl -pe 's/\b[01]+\b/oct "0b" . $&/ge' file
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29
バラより2進数、8進数、16進数変換