如何在vi编辑器中打开一个包含50k行的文件?

时间:2011-02-01 15:13:12

标签: vi

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

# wc -l build_log
52879 build_log

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

2 个答案:

答案 0 :(得分:4)

由于(根据评论)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字节(加上换行符)。

其他?

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

使用什么?

根据您使用不同工具的技能水平,我建议Perl完全适合这项工作。如果你熟悉编译C程序,那么C也很接近;我整天这样做,所以这是我的思维方式。

请注意,该解决方案明确地解决了vi诊断出的vi限制问题。我99.9%肯定会轻松处理1 KiB线;它可能会处理更长的线条。您可以选择要拆分的数字。而且我不必使用vim重新格式化甚至可怕的构建日志,所以也许你应该安装它?

答案 1 :(得分:1)

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

longest line in vim?