Для GNU sed попробуйте это (обновите снова, была небольшая ошибка):
sed '/^#\s*start/{x;s/.*/d/;x;be};/^\s*#[a-zA-Z]*/{x;G;x;s/.*//;x;};/^\s*$/{x;};:e'
Например:
$ cat file
#start
a
b
c
#whatever
...
$ cat file2
#start
a
b
c
#whatever
...
$ sed '/^#\s*start/{x;s/.*/d/;x;be};/^\s*#[a-zA-Z]*/{x;G;x;s/.*//;x;};/^\s*$/{x;};:e' file
#start
a
b
c
d
#whatever
...
$ sed '/^#\s*start/{x;s/.*/d/;x;be};/^\s*#[a-zA-Z]*/{x;G;x;s/.*//;x;};/^\s*$/{x;};:e' file2
#start
a
b
c
d
#whatever
...
Эта команда sed
перетасует эти not-so-empty
пустые строки (только пробелы).Но я думаю, это нормально для вас, не так ли?
Идея состоит в том, чтобы использовать hold space
, чтобы оставить нужную вещь нужной (d
здесь), и добавить ее, когда придет время.
x
заключается в обменеhold space
с pattern space
(текущая строка для чтения).
Кстати, если имеется несколько блоков #start
, он добавится ко всем из них, если вы не хотите, чтобы такое поведение, пожалуйстакомментарии.