파일 내부에는 test.txt
16진수 값이 있습니다.
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"|bc
e
교체 후 쉘에 의해 실행될 쉘 명령입니다.- 실제 계산에서는
\1-1
정리된 16진수는 마이너스 1이 됩니다. 16진수ibase=16
임을 알려줍니다.bc