【问题标题】:change a few bytes in a large file without loading everything in memory using bash on linux在 Linux 上使用 bash 更改大文件中的几个字节而不将所有内容加载到内存中
【发布时间】:2013-04-24 22:51:30
【问题描述】:

在 Linux 上的 bash 中,有没有办法更改大文件中的几个字节/字符?例如,寻找 x 的位置,然后选择性地删除一些字符,然后插入一些字符。我更喜欢在 bash 中执行此操作。

【问题讨论】:

  • 我认为不可行。除非 Bash 有某种 mmap 实现,您可以在脚本中使用...
  • 没有简单的方法可以做到这一点,除非您进行就地、相同字节数的替换,在这种情况下您可以使用dd(请参阅stackoverflow.com/questions/7290816/…)。如果您需要更改文件的大小,您可能必须推出自己的解决方案。你仍然可以使用dd,这非常快,但你必须在单独的dd 命令中分块前/后部分,并在此过程中编写一个临时文件。

标签: bash


【解决方案1】:

一般来说,不可能对文件进行“编辑”以更改编辑点之后的字符位置......除非通过读取和重写编辑点之后的所有字符。

这样做的原因是文件表示方式和文件系统 API 工作方式的基础。而这些又源自物理存储设备的工作方式。

因此,需要实现一个通用的解决方案(伪代码):

# Replace N bytes starting at position P with bytes B1, B2,...

open file in "random access, no truncation" mode 
seek to N + P
read remainder of file into a buffer.
seek to N
write bytes B1, B2, ...
write bytes from the buffer
close

(您可以避免将整个“文件的剩余部分”放入缓冲区,但逻辑更复杂。并且与我要解释的内容相切......)

无论如何,我不知道现有的实用程序可以执行上述操作,但如果您愿意,可以编写一个临时程序来执行此操作。


如果您要替换的字节数与替换字节数完全相同,您可以通过就地更新来做到这一点。根据How to overwrite some bytes of a binary file with dd?,您可以使用“dd”命令执行此操作。 (答案演示了一个 1 字节的就地更新。)

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 2020-08-21
    • 2014-10-22
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2012-11-17
    • 2023-04-06
    相关资源
    最近更新 更多