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