Для эффективной нерекурсивной версии конечной полосы перевода строки (включая «белые» символы) я разработал этот скрипт sed
.
sed -n '/^[[:space:]]*$/ !{x;/\n/{s/^\n//;p;s/.*//;};x;p;}; /^[[:space:]]*$/H'
Он использует буфер удержания для хранения всех пустых строк и печатает их только после того, как обнаружит непустую строку. Если кому-то нужны только новые строки, достаточно избавиться от двух [[:space:]]*
частей:
sed -n '/^$/ !{x;/\n/{s/^\n//;p;s/.*//;};x;p;}; /^$/H'
Я попробовал простое сравнение производительности с известным рекурсивным скриптом
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba'
в 3 МБ файле с 1 МБ случайных пустых строк вокруг случайного текста base64.
shuf -re 1 2 3 | tr -d "\n" | tr 123 " \t\n" | dd bs=1 count=1M > bigfile
base64 </dev/urandom | dd bs=1 count=1M >> bigfile
shuf -re 1 2 3 | tr -d "\n" | tr 123 " \t\n" | dd bs=1 count=1M >> bigfile
Потоковый скрипт завершился примерно за 0,5 секунды, рекурсия не завершилась через 15 минут. Win:)
Для полноты ответа ответ на сценарий sed с ведущими строками уже работает нормально. Используйте наиболее подходящий для вас.
sed '/[^[:blank:]]/,$!d'
sed '/./,$!d'