有效地从文本文件中删除前几行

Has*_*ard 1 editors sed awk files

  • head/tail将需要迭代几乎整个文件(取决于您作为参数提供的行的位置)。然后将该结果复制到新文件并删除旧文件。

  • 我不确定是否sed会迭代整个文件,但您需要将该结果复制到一个新文件并删除旧文件。即使-i(就地)它也会在后台创建一个临时文件,所以同样的事情也适用。

为什么不将指向文件第一行的指针移动到我们想要的行呢?

我们怎么能做这样的事情?我必须在 C 中做吗?还有其他方法吗?

那有意义吗 ??我想错了吗?如果是,为什么?

Gil*_*il' 6

为什么不将指向文件第一行的指针移动到我们想要的行呢?

因为没有“指向文件第一行的指针”这样的东西。

修改文件的基本操作是:覆盖一定范围的字节(即用相同长度的数据替换一部分)、追加(即在末尾添加)、截断(即从末尾删除)。

大多数文件系统将文件存储在固定大小的块中,除了最后一个块可能是部分的。如果修改会改变被修改内容的大小,则无法在适当的位置修改数据,除非更改在最后或者修改会将数据移动整个块数。按整数个块移动数据只能是巧合,并且没有广泛的接口¹来做到这一点。

删除文件开头数据的最有效方法是将需要保留的数据复制到新文件中。这正是做什么tail -n +42sed '41,$p'做什么。

¹现代 Linux 系统有一个系统调用来删除文件的一部分:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …),您可以通过实用程序调用它fallocate --collapse-range=…。还有FALLOC_FL_INSERT_RANGE--insert-range。但是它们仅限于块,这使得它们对于文本文件大多无用,并且它们不适用于所有文件系统。