sed заменяет несколько пустых строк одной пустой строкой

Я написал сценарий sed, который заменяет несколько пустых строк одной, но работает не так, как предполагалось. Я буду благодарен всем, кто может объяснить, почему. Пожалуйста, не отсылайте меня на рабочие примеры, я знаком с Google. Я просто хочу понять, как работает sed.

Код

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file

поэтому логика проста: когда sed читает строку и она либо пуста, либо имеет несколько символов новой строки (это /^*\n$ условие), я говорю sed, чтобы добавить следующую строку в шаблон пространства. как только найдена непустая строка, подстановка s/^\n\n*/\n/ готово.

Все работает отлично, за исключением случаев, когда в конце файла появляются пустые строки. Эти заготовки не заменяются ни одной заготовкой, и я не понимаю, почему.

Есть идеи?

2 ответа

Решение

Проблема в sed получение EOF читая следующую строку.

Ваша команда завершается во время чтения следующей строки, используя N, Потому что, читая следующую строку, sed получение EOF, Таким образом, это не будет обрабатывать s/^\n\n*/\n/ замена. Поэтому Вы не можете удалить последовательность пустых строк, которая появилась в конце файла.

Мое решение:

sed ':a; /^\n*$/{ s/\n//; N;  ba};' yourfile

Вместо \n\n*Вы могли бы использовать \n+

Кстати, это то, что выглядело бы как однострочный Perl:

perl -0777 -pe 's/\n+/\n/g' yourfile

Или для того же результата, но с меньшим количеством замен:

perl -0777 -pe 's/\n\n+/\n/g' yourfile

Или, что еще более волшебно, попробуйте это компактное решение, предложенное @hwnd:

perl -00 -pe ''
Другие вопросы по тегам