如何在bash中更改文本文件的第n个字节

如何在bash中更改文本文件的第n个字节

我正在尝试为文本文件的每兆字节添加一个数字。

例如,对于24MB的文本文件,我想将第1048576(1024*1024)字节更改为1,将第2097152(2mb至字节)字节更改为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

通过ksh93shell 使用其>#((...))查找运算符,您可以执行以下操作:

#! /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没有查找运算符,也没有任何运算符来获取文件的大小,但如果您确实必须使用该 shell,您始终可以在脚本中调用解释器(例如ksh93// zsh) 。perlbash

相关内容