Como encadear comandos de sed append?

2

Eu queria aplicar alterações no arquivo de configuração com o comando SED. É necessário inserir algumas linhas em alguns lugares depois de iniciar as tags.

No entanto, quando eu tentei:

sed '/\[httpd/\]/a secure_rewrites = false; /\[couchdb/\]/adelayed_commits = false' local.ini

Descobri que depois de [httpd] uma linha foi anexada:

secure_rewrites = false; [couchdb]/a delayed_commits=false

que obviamente não é o que eu pretendi.

É possível encadear comandos de acréscimo?

    
por 9ilsdx 9rvj 0lo 23.05.2018 / 11:51

2 respostas

3

Usando o GNU sed (o BSD sed não adicionará novas linhas após o texto adicionado, a menos que você inclua uma nova linha literal na string adicionada):

sed -e '/\[httpd\]/a\'   -e 'secure_rewrites = false;' \
    -e '/\[couchdb\]/a\' -e 'delayed_commits = false;' local.ini

Se o arquivo contiver

[httpd]
[couchdb]

inicialmente, o comando sed acima produzirá

[httpd]
secure_rewrites = false;
[couchdb]
delayed_commits = false;

Observe também que o comando a para anexar texto deve ser escrito a\ seguido do texto anexado. O GNU sed está perdoando a omissão do \ .

Como um script sed (funciona em qualquer sed ):

/\[httpd\]/a\
secure_rewrites = false;
/\[couchdb\]/a\
delayed_commits = false;

Isso pode ser usado na linha de comando como uma sequência de script literal sed com cotação única (uma nova linha deve vir após a última linha) ou armazenada separadamente e alimentada em sed usando

$ sed -f script.sed local.ini

Com #!/usr/bin/sed -f , como a primeira linha (assumindo que o caminho para sed está correto), o script pode ser executado diretamente:

$ ./script.sed local.ini
    
por 23.05.2018 / 11:58
3

Como o subcomando GNU sed a text opera um texto para adicionar, que é lido até o final da linha, você pode aplicar o seguinte truque (imitando um linebreak):

sed '/\[httpd\]/a secure_rewrites = false;
/\[couchdb\]/adelayed_commits = false' local.ini

Exemplo de saída:

...
[httpd]
secure_rewrites = false;
...
[couchdb]
delayed_commits = false
    
por 23.05.2018 / 12:08

Tags