___ qstnhdr___ sed substituir texto contendo nova linha ______ qstntxt ___

Eu tenho um script bash para instalar um servidor web no meu servidor Ubuntu.

Eu gostaria, no /etc/apache2/apache2.conf, de substituir

%pre%

por

%pre%

Se eu fizer

%pre%

está funcionando, mas eu gostaria de incluir a linha em branco e o # após o #ServerRoot para evitar adicionar duas vezes ServerName se o script for executado duas vezes.

Eu tentei

%pre%

Mas não está funcionando.

    
______ azszpr491178 ___

Que tal

  1. pesquise %code%
  2. se encontrado, lido e anexado a próxima linha no espaço padrão do sed
  3. pesquise o espaço padrão anexado por uma linha vazia após a nova linha e substitua %code% por essa

Juntando isso,

%pre%

Caso a linha 'vazia' contenha espaços em branco, você pode modificá-la para

%pre%     
______ azszpr491157 ___

Por fim, a verificação em dobro de %code% funcionando em %code% com ajuda deste . Pouco de boca cheia:

%pre%

E um awk que faz o mesmo (mais longo, mas mais fácil de entender o IMO). A lógica e %code% são explicados na última seção.

%pre%

Edit: O %code% não é tão difícil quanto eu pensava que era. Você só quer combinar e anexar (o comando %code% ); você não precisa substituir. Eu testei o seguinte como trabalhando:

%pre%

Você pode ser mais específico com o seu jogo se quiser e deixarei o %code% abaixo para a posteridade.

A edição é bastante trivial com %code% , mas para escrever novamente no mesmo arquivo, precisamos de um arquivo intermediário temporário ou %code% (do %code% package). Eu vou mostrar os dois métodos.

%pre%

Ou

%pre%

O %code% está imprimindo todas as linhas encontradas, mas no caso de uma correspondência para %code% , a linha ServerName é gravada. Eu acho esse tipo de processamento muito mais fácil de ler do que "trocar" arbitrariamente com o sed.

    
______ azszpr491205 ___

Outra forma (obrigado muru) mas um pouco fora de contexto porque não usa sed:

Para o Ubuntu 14.04 :

Crie um arquivo fqdn.conf em / etc / apache2 / conf-available / contendo

%pre%

Crie um link simbólico em / etc / apache2 / conf-enabled /

%pre%     
___

3

Eu tenho um script bash para instalar um servidor web no meu servidor Ubuntu.

Eu gostaria, no /etc/apache2/apache2.conf, de substituir

#ServerRoot "/etc/apache2"

#

por

#ServerRoot "/etc/apache2"
ServerName localhost

#

Se eu fizer

sed -i 's|#ServerRoot "/etc/apache2"|#ServerRoot "/etc/apache2"\nServerName localhost|' /etc/apache2/apache2.conf

está funcionando, mas eu gostaria de incluir a linha em branco e o # após o #ServerRoot para evitar adicionar duas vezes ServerName se o script for executado duas vezes.

Eu tentei

sed -i 's|#ServerRoot "/etc/apache2"\n\n#|#ServerRoot "/etc/apache2"\nServerName localhost\n\n#|' /etc/apache2/apache2.conf

Mas não está funcionando.

    
por tweetysat 03.07.2014 / 11:12

3 respostas

2

Que tal

  1. pesquise #ServerRoot "/etc/apache2"
  2. se encontrado, lido e anexado a próxima linha no espaço padrão do sed
  3. pesquise o espaço padrão anexado por uma linha vazia após a nova linha e substitua ServerName localhost por essa

Juntando isso,

sed -i '\|#ServerRoot "/etc/apache2"| {N;s|\n$|\nServerName localhost|}' /etc/apache2/apache2.conf

Caso a linha 'vazia' contenha espaços em branco, você pode modificá-la para

sed -i '\|#ServerRoot "/etc/apache2"| {N;s|\n\s*$|\nServerName localhost|}' /etc/apache2/apache2.conf
    
por steeldriver 03.07.2014 / 12:04
0

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.

    
por Oli 03.07.2014 / 11:28
0

Outra forma (obrigado muru) mas um pouco fora de contexto porque não usa sed:

Para o Ubuntu 14.04 :

Crie um arquivo fqdn.conf em / etc / apache2 / conf-available / contendo

ServerName localhost

Crie um link simbólico em / etc / apache2 / conf-enabled /

sudo ln -s /etc/apache2/conf-available/fqdn.conf /etc/apache2/conf-enabled/fqdn.conf
    
por tweetysat 03.07.2014 / 13:37

Tags