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

おすすめ記事