Как открыть файл с 50k строк в редакторе vi? - PullRequest
2 голосов
/ 01 февраля 2011

Я пытаюсь открыть файл журнала в редакторе Solaris vi, открывается только 4k строк. Если я открою тот же файл, используя меньше, все строки были открыты правильно. Если я выполню команду wc для этого файла,

# wc -l build_log
52879 build_log

Пожалуйста, дайте мне решение, чтобы полностью открыть этот файл в редакторе vi.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Поскольку (согласно комментариям) 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 КиБ;он вполне может обрабатывать более длинные строки.Вы выбираете номер для разделения.И мне не приходилось переформатировать даже довольно страшные журналы сборки, используя vim, так что, возможно, вам следует установить это?

1 голос
/ 01 февраля 2011

WC и VI обрабатывают линии разной длины. Хотя vi может открывать очень длинные файлы, в этом случае более вероятно, что у вас длинные строки (не отображаются в vi). Мы не можем быть уверены, потому что вы предоставили нам только ограниченные данные. Но проверьте следующую SO ветку:

самая длинная строка в vim?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...