我有一个23GB的文件,我想编辑第23行,但我在服务器上只有200 MB RAM。我不想完全打开文件,因为我只留下了20GB的可用磁盘空间。
我该怎么做?我试图使用head,tail sed但它似乎创建了一个临时文件。没有临时文件可以做到吗?
答案 0 :(得分:1)
解决方案是使用十六进制编辑器编辑文件。 Hex编辑器用于处理大型文件,甚至是整个磁盘和分区。
您可能会发现hexedit(基于ncurses)或ghex(基于Gnome / Gtk)非常有用。它们是常用的工具,因此您很可能会在您的发行版中找到它们。
我使用的所有十六进制编辑器,使用双面板视图,左侧面板以十六进制显示文件的字节,右侧面板尝试在可能的情况下显示Ascii表示。
为了查找和编辑您的第23行:
sed -n '23p' my_huge_dump.sql
:将打印此行的内容
sed -n '23p' my_huge_dump.sql | od -A n -t x1
:将以十六进制格式打印此行的内容。
或使用less -N my_huge_dump.sql
打开文件并查看第23行的内容。-N
中的less
启用行号编号
现在,了解第23行的内容:
hexedit
中,您可以使用 Tab 键在Hex和Ascii面板之间移动。在gHex中,您也可以使用鼠标。您也可以搜索您感兴趣的字符串:移至Ascii面板并按hexedit
中的 / 或使用gHex中的菜单。0A
。在ASCII面板中,新行表示为点.
然后假设您找到了要编辑的行,您有以下选项:
Fill-mode
,即您覆盖旧文本的现有内容的模式。这是gHex
和hexedit
中的默认模式。移动到要编辑的位置并开始输入。按 Backspace 将撤消您的更改。如果新内容比现有内容短,则可以用空格填充该行以避免截断文件。Insert
模式。您可以使用gHex中的菜单执行此操作。在hexedit
中,您必须使用 Esc I 键绑定。然后开始输入,新字符将附加在当前位置。 在第一种情况下,保证文件的编辑和保存将是即时的,因为将进行就地编辑。在后一种情况下,我不确定如何处理大小的增长和后续字节的移动,但我希望文件系统使用更大的非连续块来移动一些内容而不是移动整个文件。
如果您对更改感到满意,请保存文件:
hexedit
中使用 Ctrl x ,并在询问是否保存更改时回答(Y)es
。始终确保备份到位!
编辑:我发现gHex
并不适合您的情况,因为它试图将整个文件加载到内存中。 hexedit
会很好。但是,如果您需要gHex
之类的图形编辑器,但具有部分文件加载功能,则可以尝试wxHexEditor。另请查看维基百科中的Comparison of Hex editors页面。
答案 1 :(得分:0)
Liquid Studio Community Edition包含一个Large File Editor,它可以在低规格机器上打开和编辑Terra-byte文件,并且是免费的。
它需要足够的磁盘空间来复制文件(将其写回时),但几乎不需要任何内存。