Como grep 7 linhas após a partida e substituir o texto?

1

Estou tentando o grep 7 linhas após a correspondência e substituo um contexto nessas 7 linhas e salve-o no mesmo arquivo.

Por exemplo:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

Eu gostaria de substituir o valor de MaxRequestsPerChild por 5000 .

Eu tentei com:

grep "IfModule prefork.c" httpd.conf -A7 | /bin/sed -nE "/\bMaxRequestsPerChild\b/ s/[0-9]+/50/"

Mas sem sorte.

    
por msp9011 21.06.2018 / 11:20

3 respostas

1

Aqui está uma solução de SED, espero que ele o ajude.

sed '/<IfModule prefork.c>/,/MaxRequestsPerChild/s/MaxRequestsPerChild.*/MaxRequestsPerChild 5000/' apacheconf

Funciona combinando o nome do módulo e substituindo a próxima linha "MaxRequestsPerChild" pelo valor 5000. Ele irá ignorar o "MaxRequestsPerChild" de todos os outros módulos.

Tente.

    
por 21.06.2018 / 15:13
0

Com o GNU sed (não tenho certeza se a sintaxe / recurso está correto para outras versões)

Para alterar dentro de 6 linhas após a linha de correspondência:

sed -E '/IfModule prefork\.c/{N;N;N;N;N;N;s/(MaxRequestsPerChild +)[0-9]+/000/}'

aqui, N adicionará uma nova linha ao espaço padrão e, em seguida, anexará a próxima linha de entrada ao espaço padrão


Se é sempre a sexta linha:

sed -E '/IfModule prefork\.c/{n;n;n;n;n;n;s/[0-9]+/5000/}'

aqui n irá substituir o espaço padrão pela próxima linha de entrada


Ou uma sintaxe mais simples com endereçamento relativo

sed -E '/IfModule prefork\.c/,+6 s/(MaxRequestsPerChild +)[0-9]+/000/'
    
por 21.06.2018 / 12:00
0

Você pode colocar sed range operator , em bom uso aqui, caso seja indiferente aos números de linha:

sed -e '
   /<IfModule prefork.c>/,\|</IfModule>|!b
   H;\|</IfModule>|!d;g;s/.//;
   s/\(\(\n\)MaxRequestsPerChild[[:blank:]]\{1,\}\)[1-9][0-9]*\n/000/
' config-file
  1. Armazene o intervalo no espaço de armazenamento.
  2. Quando o final do intervalo for detectado, recupere o intervalo da área de espera e
  3. Execute a substituição desejada.
  4. As linhas que não estão no intervalo são deixadas para si e passadas para o stdout.
por 21.06.2018 / 13:09