이진 문자열을 십진수로 변환

이진 문자열을 십진수로 변환

bash 스크립트를 사용하여 다음과 같은 텍스트 파일을 처리하고 싶습니다.

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

이진수(항상 4자리보다 길음)를 가져와서 이를 십진수 표현으로 변환합니다.

이전 예에서 최종적으로 사용하려는 파일은 다음과 같습니다.

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

나는 탐색해 왔지만 tr교체 sed하기 전에 일치하는 패턴을 사용하는 것을 허용하지 않는 것 같습니다(변환하기 위해). 어떡해?

편집: @DopeGothi의 제안에 따라 한 줄에 최대 하나의 이진수가 있다는 점을 고려하면 이진수의 모든 십진수 버전을 포함하는 임시 파일을 만들 수 있습니다. 문제는 이제 이를 삽입해야 한다는 것입니다.

첫 번째 파일에서 이진수를 찾을 때마다 파일에서 해당 숫자를 십진수로 바꿉니다.

답변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

packPerl의 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진수 변환

관련 정보