Remove tudo antes da primeira ocorrência da palavra especificada

2

Como posso remover tudo antes da primeira ocorrência de uma palavra especificada usando sed ?

O que tentei até agora:

echo $(cat /etc/nginx/sites-enabled/default | sed 's/^*.server/server/') > /etc/nginx/sites-enabled/default

Preciso limpar toda a lixeira antes de encontrar a primeira palavra "servidor".

Principalmente, eu precisaria de um sed regex ...

Eu tenho um arquivo padrão Nginx com informações de proxy que está obtendo alguns espaços iniciais enquanto o script o copia para um contêiner do Docker e, portanto, não pode ser usado. Eu preciso excluir com algum comando.

Arquivo:

       server
{
listen 80 default_server;
location / 
{
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
}

Não sei ao certo que tipos de caracteres existem, por isso gostaria de remover tudo antes de 'servidor'.

    
por ArkadyB 18.02.2016 / 11:29

2 respostas

2

Você simplesmente remove cada caractere de espaço em branco (guias, espaços, o que for) entre o início da linha e a palavra "servidor" (somente se não houver nada além de espaços em branco) usando o seguinte comando simples:

sed -i 's/^\s*server/server/' FILENAME

A opção -i modifica o arquivo no local, o que significa que todas as alterações são aplicadas e salvas imediatamente e você não obtém nenhuma saída. Se você não quiser reescrever o arquivo e ver a nova versão modificada, omita a opção -i e o comando irá imprimi-lo no STDOUT (fluxo de saída padrão).

Eu uso o regex ^\s*server para corresponder a qualquer número de qualquer tipo de espaços em branco entre o início da linha e a palavra "servidor", inclusive, e deixá-lo substituir essas correspondências pela palavra "servidor" em si.

    
por Byte Commander 18.02.2016 / 11:53
1

O GNU sed tem uma forma especial de endereço de intervalo 0,/pattern/ que permite corresponder apenas a primeira ocorrência de pattern em seu arquivo, por exemplo

sed '0,/server/ s/^.*server/server/' /etc/nginx/sites-enabled/default

ou (talvez melhor, desde que ancora a partida para o início da linha também)

sed '0,/^.*server/ s//server/' /etc/nginx/sites-enabled/default


Experimente primeiro antes de adicionar o sinalizador -i (in-place) e / ou usar um backup -i.bak

    
por steeldriver 18.02.2016 / 14:03