SED: Regex входной длины буфера больше, чем int_max

Конечно, вы можете настроить screen или tmux хардлайн.

Пример использования screen: http://blog.boreas.ro/2008/03/gnu-screen-for-win.html

Пример использования tmux:

tmux

tmux и screen потрясающие - вы должны научиться их использовать.

-2
05.07.2018, 07:59
2 ответа

Ваш вопрос странный. Вы говорите: «… только что возникла эта ошибка. Я пытался погуглить, но ничего не нашел в этом», сделать вид, что ты понятия не имеешь, что происходит. Но ты же понимаешь это, не так ли? Когда вы говорите sed -z, вы говорите sedпрочитать ввод, обработка NUL как записи (разделителей строк )вместо новой строки. Но текстовые файлы обычно не содержат символов NUL, так что с практической точки зрения это означает, что вы хотите sedпрочитать весь файл и рассматривать его как одну строку. Вы, очевидно, понимаете это; ваша 's/.*/[&]/'команда, чтобы «заключить весь файл в квадратные скобки», не имеет смысла, если вы не ожидаете полного файла рассматриваться как одна линия.

Так почему же вы так удивлены, что ваш большой файл слишком велик, чтобы его можно было обрабатывать как одну строку?

Вы говорите, что ваш сценарий иногда срабатывает — предположительно, когда размер файла меньше максимального размера строки, разрешенного sed. Этот скрипт должен делать то же самое, независимо от размера файла:

cat "$FILE" | sed -e 's/.*/"&",/' -e '1s/^/[/' -e '$s/$/]/' | tr --delete '\n'

Конечно, это все еще может задохнуться, если какая-либо отдельная строка во входных данных абсурдно долго.

Примечания:

  • Вам не нужны {и }; "$FILE"в порядке.
  • Следуя предложению steeldriver , это вставляет [в начале первой строки и добавляет ]в конце последней строки.
  • Я оставил spongeдля иллюстрации. Перезапись вашего входного файла может быть необходима для работы, но это плохо делать, пока вы все еще отлаживаете. Добавьте команду spongeобратно, когда будете уверены, что она делает то, что вам нужно.

Это дублирует ваш скрипт, поэтому ввод

The quick brown fox
jumps over
the lazy dog.

даст результат

["The quick brown fox","jumps over","the lazy dog.",]

с дополнительной запятой перед ]. Если это действительно то, чего ты хочешь, хорошо, я согласен. Если вам не нужна запятая в конце, введите

cat "$FILE" | sed -e 's/.*/"&",/' -e '1s/^/[/' -e '$s/,$/]/' | tr --delete '\n'

где команда '$s/,$/]/'удаляет запятую в конце файла при добавлении ].

Также обратите внимание, что все обсуждавшиеся до сих пор команды оставит вам файл без символов новой строки,ни одного в конце. Это искаженный текстовый файл, и некоторые команды не могут правильно его обработать. Если это действительно то, чего ты хочешь, хорошо, я согласен. В противном случае добавьте

echo >> "$FILE"

или

printf '\n' >> "$FILE"

в конце вашего скрипта.

4
28.01.2020, 05:14

Если вы не требовали sed, awk может сделать это, ИМХО, немного понятнее:

Редактировать :оригинальный метод (исправлено G -Man, tnx ), который я основывал на выводе примера в Q с запятой после последней строки:

 awk <"$FILE" -vORS= -vq=\" 'BEGIN{print "["} {print q $0 q ","} END{print "]\n"}' | sponge "$FILE"
  • как сказал G -Man, оставьте часть spongeдля отладки
  • если вы не хотите, чтобы в конце была новая строка, оставьте\n

Добавлен :модифицированный метод, основанный на запросе на удаление последней запятой перед добавлением скобок:

 awk <"$FILE" -vORS= -vq=\" 'BEGIN{print "["} {print sep q $0 q; sep=","} END{print "]\n"}' | sponge "$FILE"

(В awk неинициализированная переменная в строковом контексте гарантированно вернет пустую строку, но если вы предпочитаете быть явным, добавьте -vsep=к опциям или ;sep=""к блоку BEGINдля ее инициализации.)

1
28.01.2020, 05:14

Теги

Похожие вопросы