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.