Anexar linha com sed ou awk

2

Em um script bash eu tenho que acrescentar uma linha em um arquivo systemd. O arquivo é assim:

[Unit]
...

[Service]
...

A linha deve ser anexada na seção [Unidade] e depois de todas as linhas desta seção:

[Unit]
...
---MY LINE--- 

[Service]
...

Eu sei como anexar a linha diretamente após [Unit]:

[Unit]
---MY LINE---
...

[Service]
... 

com sed assim:

$ sed '/\[Unit\]/a ---MY LINE---' input_file

mas como posso acrescentar minha linha depois de todas as linhas da seção?

    
por coverflower 03.05.2018 / 08:53

1 resposta

4

Se você tem o GNU awk em seu sistema, você pode usar o seguinte script. Ele anexa a string logo antes do início da próxima seção.

awk -v RS='\[[^]]*\]' '{printf $0; if(oRT~/Unit/){print "---MY LINE---"}; printf RT; oRT=RT}' input_file

RS é o separador de registros. É um regex definido para qualquer coisa entre colchetes, de modo que corresponda a [Unit] e [Service] . Ter esse RS permite ter um registro com o conteúdo completo de uma seção de bloco.

RT é o terminador de registro. É definido dinamicamente por awk para cada registro com base em RS . Ele irá armazenar [Unit] e [Service] .

O truque é armazenar o terminador de registro na variável oRT . Se este tiver a palavra Unit , anexe a string desejada ---MY LINE--- .

Se você quiser acrescentar a string antes da linha vazia no final da seção, use o seguinte script:

awk -v RS='\[[^]]*\]' 'oRT~/Unit/{sub(/\n$/,"---MY LINE---\n\n")}{printf $0 RT; oRT=RT}' input_file

A função sub substitui a linha vazia no final do registro, acrescentando a string desejada e uma linha vazia.

    
por 03.05.2018 / 10:23