Obtenha um intervalo de linhas de um arquivo e substitua uma linha nesse intervalo usando awk ou sed ou ambos

1

Eu gostaria de substituir uma linha em uma seção do arquivo smb.conf usando awk ou sed ou ambos, se necessário. Aqui está a seção no arquivo ...

[CMI] oplocks = no wide links = no writeable = yes delete readonly = yes path = /LOCALSITE/CMI comment = CMI Data write list = @cbishare valid users = @cbishare create mode = 775 directory mode = 775

Eu gostaria de usar este código para reutilização posterior com uma variável para rodar em seções diferentes do arquivo smb.conf. Então, apenas encontrar "lista de gravação" em cada seção não funcionará.

Eu posso analisar o arquivo e obter a seção usando este código ...

awk '/\[\CMI\>\]/,/^$/' /etc/samba/smb.conf

ou com sed ...

sed -n '/\[\CMI\>\]/,/^$/{p}' /etc/samba/smb.conf

Agora preciso substituir no arquivo uma linha específica nesse intervalo, como "lista de gravação". Eu sou um novato com sed ou awk e não encontrei nenhuma informação sobre como realizar a última parte.

Eu pensei que talvez eu pudesse pegar o NR da linha e usar o sed para reescrevê-lo.

Quaisquer pensamentos sobre como fazer isso ou links para uma solução seriam muito apreciados.

    
por Matt Pedigo 02.10.2014 / 19:58

1 resposta

0

com sed

Para substituir o valor de "lista de gravação" na seção CMI e apenas na seção CMI:

sed '/\[\CMI\>\]/,/^$/ s/\s*write list =.*/ write list = New Value/' smb.conf

Isso substitui o valor antigo de write list por New Value . Ele assume, como foi assumido em seu código, que as seções em smb.conf terminam com uma linha em branco.

com awk

Da mesma forma:

awk '/\[\CMI\>\]/,/^$/ {if ($1=="write" && $2=="list") {$0=" write list = New Value"}} 1' smb.conf
    
por 02.10.2014 / 20:21