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 ''