由于(根据 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 重新格式化甚至相当可怕的构建日志,所以也许你应该安装它?