Como usar o sed para substituir um caminho do Linux em um arquivo de texto específico

1

Estou escrevendo alguns comandos em alguma documentação que estou escrevendo sobre como estou configurando o NGINX. Em vez de escrever 'abra isso usando o vi' e esperar que alguém saiba tudo isso, eu só quero dizer executar este comando sed.

Esta é a minha primeira vez com sed.

O arquivo contém uma entrada

server {
    {{{{{{OTHER STUFF}}}}}}}

    root /var/www/html;

    {{{{{{MORE STUFF}}}}}}
} 

Eu quero substituí-lo por /var/www e remover o html .

Estou lutando com as barras e o aninhamento. Existem outras instâncias da palavra "raiz" no arquivo.

Isso não funciona

sed -i 's//var/www/html//var/www/g' default
    
por CarComp 15.09.2017 / 19:27

3 respostas

2

sed pode usar um caractere arbitrário para o delimitador de padrão:

sed -i 's#root /var/www/stuff#root /var/www#' somefile 

O modificador g é inútil aqui, já que você não espera mais de um jogo por linha.

Para portabilidade:

sed 's#root /var/www/stuff#root /var/www#' somefile >newfile && mv newfile somefile

Quanto à sua documentação, basta dizer "alterar esta linha em um editor". Se eles estão configurando o nginx, eles devem saber como usar um editor, ou assim esperamos.

Geralmente, alterar coisas em arquivos de configuração, se for apenas uma edição única, é menos propenso a erros quando feito manualmente. Dessa forma, você não corre o risco de ter uma expressão regular mal montada enlouquecida e mudar as coisas de formas que não foram planejadas.

    
por 15.09.2017 / 19:30
3

Use um delimitador diferente para o comando sed , que o GNU sed permite que isso seja usado. Você pode usar qualquer delimitador onde você saiba que ele não estará presente em seus padrões; ou então você deve escapar o / ou qualquer outro caractere especial .

sed 's% /var/www/html% /var/www%' default

O mais novo GNU sed suporta substituição no local ao usar a opção -i . para usuários de MAC e FreeBSD, eles devem usar -i '' .

Você também pode obter um backup com essa opção -i.back , onde fará uma cópia do arquivo default.back .

    
por 15.09.2017 / 19:32
2
sed -i 's/\/var\/www\/html/\/var\/www/g' filename.txt

No entanto, estou aberto a melhores respostas.

    
por 15.09.2017 / 19:30