sed для s / old / new в отдельных строках, вот и все.Каждый раз, когда вы начинаете говорить о буферах или делать что-либо, связанное с многострочным сравнением, вы используете неправильный инструмент.
Вы можете сделать это с помощью awk:
$ awk -v RS= -F'\n' 'NR>1{print $1}' file
bla3
bla5
, но это не получитсянапечатать первую непустую строку, если первые строки в файле были пустыми, поэтому это может быть тем, что вам нужно, если вы хотите, чтобы строки всех пробелов считались пустыми:
$ awk 'NF && !p{print} {p=NF}' file
bla3
bla5
и это иначе:
$ awk '($0!="") && (p==""){print} {p=$0}' file
bla3
bla5
Все вышеперечисленное будет работать, даже если перед любой данной непустой строкой будет несколько пустых строк.
Чтобы увидеть разницу между тремя подходами (которыеВы не увидите, учитывая образец ввода в вопросе):
PS1> printf '\nfoo\n \nbar\n\netc\n' | cat -E
$
foo$
$
bar$
$
etc$
PS1> printf '\nfoo\n \nbar\n\netc\n' | awk -v RS= -F'\n' 'NR>1{print $1}'
etc
PS1> printf '\nfoo\n \nbar\n\netc\n' | awk 'NF && !p{print} {p=NF}'
foo
bar
etc
PS1> printf '\nfoo\n \nbar\n\netc\n' | awk '($0!="") && (p==""){print} {p=$0}'
foo
etc