Converter strings binárias em decimal

0

Eu quero processar com um script bash um arquivo de texto com esta aparência:

ADD    $05  $05  $05
SUBI   $06  $06  00011
MUL    $07  $07  $07
JSR    011101

pegando os números binários (que são sempre maiores que 4 bits) e convertendo-os em sua representação decimal.

Para o exemplo anterior, este é o arquivo que quero finalizar:

ADD    $05  $05  $05
SUBI   $06  $06  3
MUL    $07  $07  $07
JSR    29

Eu tenho explorado tr e sed , mas acho que eles não me deixam trabalhar com o padrão correspondente (para convertê-lo) antes da substituição. Que abordagem posso fazer?

EDITAR: Com a sugestão de @DopeGothi, e dado que eu tenho no máximo um número binário por linha, posso criar um arquivo temporário com todas as versões decimais dos números binários. A questão é que agora preciso intercalá-los:

Toda vez que eu encontro um número binário no primeiro arquivo, eu substituo com o número correspondente no arquivo com decimais.

    
por onlycparra 29.09.2018 / 01:39

2 respostas

1

Há provavelmente uma maneira mais elegante de usar pack e unpack de Perl, mas usando uma combinação de manipulação de string e 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

Veja Convertendo números binários, octais e hexadecimais

    
por 29.09.2018 / 04:10
1

Experimente este pequeno script 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  

Pode se beneficiar de algum polimento. Ele lê as linhas do arquivo em uma matriz, testa se seus elementos contêm apenas dígitos binários (0 e 1), usa "avaliação aritmética" com o prefixo base 2 2# se sim, antes de imprimir

    
por 29.09.2018 / 10:16