-
head
/テールコード> (パラメータとして指定した行の位置に応じて)ファイルのほぼ全体を反復処理する必要があります。
次に、その結果を新しいファイルにコピーし、古いファイルを削除します。 -
sed
かどうかわかりません ファイル全体を反復処理しますが、その結果を新しいファイルにコピーして、古いファイルを削除する必要があります。-i
でも (その場で)内部に一時ファイルを作成するので、同じことが当てはまります。
ファイルの最初の行を指すポインタを移動して、目的の行に移動してみませんか?
どうすればそのようなことができますか?私はCでやらなければなりませんか?他の方法はありますか?
それは理にかなっていますか ??私は間違って考えていますか?はいの場合、なぜですか?
承認された回答:
ファイルの最初の行を指すポインタを移動して、目的の行に移動してみませんか?
「ファイルの最初の行を指すポインタ」などがないためです。
ファイルを変更するための基本的な操作は、バイト範囲の上書き(つまり、一部を同じ長さのデータで置き換える)、追加(つまり、最後に追加)、切り捨て(つまり、最後から削除)です。
ほとんどのファイルシステムは、最後のブロックが部分的である可能性があることを除いて、ファイルを固定サイズのブロックに格納します。変更が最後にあるか、変更によってデータが整数ブロックシフトされる場合を除いて、変更によって変更対象のサイズが変更される場合は、データを適切に変更する方法はありません。整数のブロックでデータをシフトすることは偶然の一致によってのみ機能し、それを行うための広範なインターフェース¹はありません。
ファイルの先頭でデータを削除する最も効率的な方法は、保持する必要のあるデータを新しいファイルにコピーすることです。これがまさにtail-n +42
またはsed'41、$ p'
します。
¹最近のLinuxシステムには、ファイルの一部を削除するシステムコールがあります: fallocate(fd、FALLOC_FL_COLLAPSE_RANGE、…)
、ユーティリティ fallocate--collapse-range=…
を介して呼び出すことができます 。 FALLOC_FL_INSERT_RANGE
もあります および--insert-range
。ただし、ブロックに制限されているため、テキストファイルにはほとんど役に立たず、すべてのファイルシステムで使用できるわけではありません。