텍스트 파일의 16진수 값을 (수정된) 10진수 값으로 바꿉니다.

텍스트 파일의 16진수 값을 (수정된) 10진수 값으로 바꿉니다.

파일 내부에는 test.txt16진수 값이 있습니다.

0x0000000000000000000000000000000000000000047546124890225541102135415377465907

단 한 줄. 다른 줄이나 문자는 없습니다. 또한 0x로만 식별됩니다.

388355321549592156970965297418600041568519이 16진수 값을 10진수( )로 변환하고 1을 빼고 이 연산의 결과로 원래 값을 덮어쓰고 싶습니다.test.txt

궁극적으로 파일의 데이터는 test.txt다음에서 시작해야 합니다.

0x0000000000000000000000000000000000000000047546124890225541102135415377465907

도착하다

388355321549592156970965297418600041568518

Bash(Linux 셸)를 사용하여 이 작업을 수행하는 방법을 알려주시면 감사하겠습니다.

답변1

, 를 사용하여 perl파일을 제자리에서 편집합니다.

perl -Mbigint -lpi -e '$_ = hex($_) - 1' your-file

전체 줄이 16진수라고 가정합니다. 위치에 상관없이 모든 16진수를 변환하려면:

perl -Mbigint -lpi -e 's{\b0x[\da-f]+\b}{hex($&) - 1}gie' your-file

답변2

암소 비슷한 일종의 영양awk

gawk -M '{print strtonum($0)-1}' file

-M(또는 --bignum) 임의의 정밀도 산술을 위한 것입니다. strtonum($0)로 시작하는 문자열을 16진수로 처리하여 레코드의 숫자 값을 가져옵니다 0x. -i inplace입력 파일을 내부 편집하기 위한 것입니다 .

답변3

Bash의 명령을 통해 이 문자열과 계산기(접미사 표기 포함)를 사용하세요.

dc -e '16iAo?1-p' <<<$(<file) >file

16i-기지 입력
Ao-출력 베이스
?-한 줄을 읽어라
1--마이너스 1
p-인쇄

참고: 이는 귀하의 예에 지정되어 있지 않습니다. dc계산기는 대문자 16진수 [ABCDEF]를 허용합니다.

답변4

이 대답은 파일 어딘가에 있는 16진수에 대한 질문에 제공된 것입니다. 나중에 전체 파일이 해당 번호로만 구성되었다는 질문이 업데이트되었습니다. 이 답변은 여전히 ​​유효하지만 물론 sed이 특별한 경우에는 사용하지 않을 것입니다. 원래 질문에 대한 답을 찾는 사람을 위한 참고 자료로 여기에 남겨둡니다. 댓글도 주의해주세요.

가 있다면 bash아마도 GNU도 있을 것입니다 sed(명령 e플래그 포함 s). 그렇다면 bc숫자가 너무 크기 때문에 계산기 도 필요합니다 bash.

sed 's/^0x0*\(.*\)/echo "ibase=16; \1-1"|bc/e' yourfile
  • 제 생각에는 로 시작하는 모든 줄을 0x변환해야 하지만 쉽게 조정할 수 있습니다.
  • 0x0*\(.*\)바꿔야 할 패턴입니다. 선행 및 추가 선행 0을 제거 하고 교체 시 참조 0x할 수 있도록 다른 모든 항목은 그대로 두었습니다.\(…\)\1
  • echo "ibase=16; \1-1"|bce교체 후 쉘에 의해 실행될 쉘 명령입니다.
  • 실제 계산에서는 \1-1정리된 16진수는 마이너스 1이 됩니다. 16진수 ibase=16임을 알려줍니다.bc

관련 정보