O sed
correto é
sed '2,$s/^#/\n#/' filename
Isso adicionará uma nova linha somente antes das linhas que começarem com um comentário.
O 2,$
informa sed
para começar a avaliar da segunda linha até a última linha do arquivo. No comando substituto s
, estamos procurando linhas que começam com o símbolo de comentário ( ^#
) e substituímos essa ocorrência na linha por uma nova linha e o símbolo de comentário encontrado ( \n#
).
Você não precisa da opção g
no final do comando porque não deseja substituir todos os #
encontrados em uma linha.
Isso só funcionará com o GNU sed
, porque \n
na string de substituição é indefinida no padrão. Mas você pode fazer
sed '1n;/^#/{x;p;x;}' filename
em vez disso. O 1n
imprime a primeira linha e continua com o próximo. Desta forma evitamos o "endereçamento" das linhas 2 até o final. Portanto, agora podemos endereçar todas as linhas que começam com #
e para todas aquelas dentro do {}
são executadas: x
troca o conteúdo do espaço padrão e armazena espaço. O espaço de espera está vazio, então p
imprime uma linha vazia, o segundo x
altera os buffers de volta, então o espaço de espera está vazio novamente e a linha original é impressa por padrão.