Por fim, a verificação em dobro de \n funcionando em sed com ajuda deste . Pouco de boca cheia:
sed -Ei ':a;N;$!ba;s/^(#ServerRoot[^\n]*)\n\n/\nServerName localhost\n\n/' apache2.conf
E um awk que faz o mesmo (mais longo, mas mais fácil de entender o IMO). A lógica e sponge são explicados na última seção.
awk '{print}/^#ServerRoot/{getline; if($0=="") print "ServerName localhost"; print}' apache2.conf | sponge apache2.conf
Edit: O sed não é tão difícil quanto eu pensava que era. Você só quer combinar e anexar (o comando a ); você não precisa substituir. Eu testei o seguinte como trabalhando:
sed -i '/^#ServerRoot/a ServerName localhost' apache2.conf
Você pode ser mais específico com o seu jogo se quiser e deixarei o awk abaixo para a posteridade.
A edição é bastante trivial com awk , mas para escrever novamente no mesmo arquivo, precisamos de um arquivo intermediário temporário ou sponge (do moreutils package). Eu vou mostrar os dois métodos.
awk '{print}/^#ServerRoot/{print "ServerName localhost"}' apache2.conf > tmp
mv tmp apache2.conf
Ou
awk '{print}/^#ServerRoot/{print "ServerName localhost"}' apache2.conf | sponge apache2.conf
O awk está imprimindo todas as linhas encontradas, mas no caso de uma correspondência para ^#ServerName , a linha ServerName é gravada. Eu acho esse tipo de processamento muito mais fácil de ler do que "trocar" arbitrariamente com o sed.