Bash에서 텍스트 파일의 n번째 바이트를 변경하는 방법

Bash에서 텍스트 파일의 n번째 바이트를 변경하는 방법

텍스트 파일의 각 메가바이트에 숫자를 추가하려고 합니다.

예를 들어 24MB 텍스트 파일의 경우 1048576번째(1024*1024) 바이트를 1로 변경하고, 2097152번째(2mb to byte) 바이트를 2로 변경하고 싶습니다. 10mb 표시(10485760번째 바이트)의 경우 10485759번째 바이트에 1을 추가하고 10485760번째 바이트에 0을 추가하고 싶습니다.

내가 생각한 것은 awk내가 찾은 명령을 사용하는 것이었습니다온라인,이와 같이:

awk '$0=substr($0,1,1048575)"[some number here]"substr($0,1048577,length($0))' input.txt > output.txt

하지만 이 명령을 사용하면 의 입력을 변경하는 것이 불가능한 것 같습니다. [some number here]포인터(또는 유사한 것)를 특정 바이트 수만큼 이동하고 포인터가 가리키는 바이트를 변경한 다음 포인터를 다시 이동할 수 있는 방법이 있습니까?

감사해요.

답변1

셸을 통해 검색 연산자를 ksh93사용하면 다음을 수행할 수 있습니다.>#((...))

#! /bin/ksh93 -

LC_ALL=C
block=${1?Please specify a block size}; shift

for file do
  for (( n = 1; n * block <= size; n++ )); do
    printf %s "$n" >#(( n * block - ${#n} )) || break
  done 1<> "$file" >#(( size = EOF ))
done

(로 사용됨 that-script 1048576 file1 file2...).

zsh내장과 동일 sysseek:

#! /bin/zsh -
zmodload zsh/system || exit
block=${1?Please specify a block size}; shift

for file do
  {
    sysseek -u 1 -w end 0 || continue
    (( size = systell(1) ))
    for (( n = 1; n * block <= size; n++ )); do
      sysseek -u 1 $(( n * block - $#n )) &&
        printf %s $n ||
        break
    done
  } 1<> $file
done

bash파일 크기를 가져오는 찾기 연산자나 연산자는 없지만 해당 셸을 꼭 사용해야 하는 경우 언제든지 스크립트에서 인터프리터를 호출할 수 있습니다(예: ksh93// zsh).perlbash

관련 정보