【问题标题】:How to open a file having 50k lines in vi editor?如何在 vi 编辑器中打开一个有 50k 行的文件?
【发布时间】:2011-06-19 08:29:04
【问题描述】:

我试图在 solaris vi 编辑器中打开一个日志文件,只打开了 4k 行。如果我使用 less 打开同一个文件,所有行都会正确打开。如果我对该文件执行 wc 命令,

# wc -l build_log
52879 build_log

请给我一个在 vi 编辑器中完全打开该文件的解决方案。

【问题讨论】:

  • '只有 4k 行被打开。' - 那会发生什么?电脑死机,出现错误信息,一切正常吗?
  • 这些肯定是一些很长的行,我经常打开比这个行多得多的文件(并且大小> 10M)

标签: vi


【解决方案1】:

由于(根据 cmets)vi 告诉您“行太长”,您必须找到一种方法将超长行包含在文件中,以便“vi”可以处理它们。或者安装vim;我没有注意到它对行长有限制。

如何包装?

自己编写包装器可能是最简单的 - 可能有内置工具可以完成这项工作,但您必须找到合适的工具。这是一个用 C 语言编写的粗略但有效的纯过滤器 - 我花了很长时间来编写它:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char buffer[1024];

    while (fgets(buffer, sizeof(buffer), stdin) != 0)
    {
        const char *endl = strchr(buffer, '\n') ? "" : "\n";
        printf("%s%s", buffer, endl);
    }
    return 0;
}

它读取长达 1023 字节的行并将其原封不动地吐出。较长的行被拆分;当它读取行的初始段时,缓冲区末尾没有换行符,所以我们人为地添加了一个。这包裹了超长的线条。将其编译为'linesplitter';用作:

linesplitter <build.log > wrapped.build.log

显然,您可以增强它以处理文件列表或接受参数来控制行拆分的长度。如果你想变得花哨,你可以在空白处分割。有无数的工具可能也可以完成这项工作;我知道我自己有几个可以完成这项任务的不同变体,自 80 年代中期以来在不同时间编写。

Perl?

如果你喜欢(你可能应该),你可以使用 Perl:

perl -p -e 'while (length($_) > 1024)
            { printf "%.1024s\n", $_; $_ = substr($_, 1024); }'

可能有一种更紧凑的编写方式,但它在 90% 的战斗中都有效。您可以使用以下方法对其进行测试:

perl -e 'print "abcdefgh" x 300, "\n"' | ...

生成一个 2400 字节的行; linesplitter 程序和 Perl 脚本都输出 3 行数据,但输出存在差异,因为一个将行限制为 1023,另一个限制为 1024 字节(加上换行符)。

其他?

可以在 Perl 中完成的事情可以在 Python 中完成。您也许可以使用awk(至少nawk)。您也许可以使用sed。您也许可以使用pr。可能有一个程序fmt

用什么?

根据您使用不同工具的技能水平,我建议 Perl 足以胜任这项工作。如果您熟悉编译 C 程序,C 也几乎是微不足道的;我整天都这样做,所以这是我的思维方式。

请注意,该解决方案明确解决了 vi 中由 vi 诊断出的限制。我 99.9% 确信它可以轻松处理 1 KiB 行;它可能会处理相当长的行。您选择要拆分的号码。而且我不必使用vim 重新格式化甚至相当可怕的构建日志,所以也许你应该安装它?

【讨论】:

    【解决方案2】:

    wc 和 vi 处理不同长度的行。虽然 vi 可以打开很长的文件,但在这种情况下,您更有可能有很长的行(不在 vi 中显示)。我们无法确定,因为您只向我们提供了有限的数据。但请查看以下 SO 线程:

    longest line in vim?

    【讨论】:

    • 我有一个包含 4 行数据的临时文件。打开该文件时,我在 vi 编辑器底部收到以下消息。 "temp" 4 lines, 24 characters 打开我的日志文件时,我收到了"build_log" Line too long 的消息。更过,当用“less”打开它时,它会完全打开。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多