ファイルの先頭と末尾からバイトをトリムするにはどうすればよいですか?

ファイルの先頭と末尾からバイトをトリムするにはどうすればよいですか?

ファイルの先頭と末尾にゴミ (バイナリ ヘッダーとフッター) があるファイルがあります。これらのバイトを削除する方法を知りたいです。例として、先頭から 25 バイトと仮定します。そして、末尾から 2 バイトです。

truncate と dd を使用できることはわかっていますが、truncate はストリームでは機能せず、ハード ファイルで 2 つのコマンドを実行するのは少々不格好に思えます。 がtruncateファイルの大きさを認識して、ファイルを に cat できればもっと便利ですdd。または、これを行うもっと良い方法はありますか?

答え1

GNUを組み合わせることができますtailそしてhead:

tail -c +26 file | head -c -2

fileは、バイト 26 から始まり、-2末尾の 2 バイト前 (マイナス 2 バイト前)で停止するの内容を出力します。(-cは文字ではなくバイトに対して動作します。)

答え2

ddは、1 つのコマンドで両方を実行します。ブロック サイズを 1 バイトに設定し、最初の 25 バイトをスキップし、スキップ バイトと終了バイトを引いたファイル サイズをカウントします。

100 byte file
file.img

dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73

数字は 0 からカウントされる可能性があるため、再度確認してください。

答え3

ksh93の場合:

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))

または、インプレースで実行する場合は次のようにします。

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file

/opt/ast/binより先にを持っている場合は$PATH、組み込みを取得しますhead

  • <#((...))lseek()演算子です。...は算術式として解釈され、 はEOFファイルの長さです。 つまり、上記では、表示する部分の長さを割り当て$n、ファイル内の 25 バイトをシークしています。
  • <>;読み取り + 書き込みモードで開き、コマンドが成功した場合は切り捨てるリダイレクト演算子です。

関連情報