cant: remova todas as correspondências no arquivo e insira algumas linhas onde a primeira correspondência foi

3

Digamos que eu queira atualizar automaticamente minha configuração /etc/ntp.conf usando sed . O formato de ntp.conf permite definir listas usando as mesmas palavras-chave para as linhas ocorridas em todo o arquivo. Por exemplo:

# first block occurrences
server 1.1.1.1
server 2.2.2.2

driftfile /var/lib/ntp/drift

# second block of occurrences
server 3.3.3.3
server 4.4.4.4

Agora, tenho uma lista atualizada de ntp servidores, digamos 5.5.5.5, 6.6.6.6 e 7.7.7.7. Como resultado, quero obter:

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

Posso fazer isso com sed ? É a ferramenta certa para este problema ou devo usar outra coisa?

P.S .: comentar o segundo bloco (ou ambos) de ocorrências também pode ser uma opção.

    
por reddot 04.02.2017 / 17:37

2 respostas

0

Se você tiver a nova lista de servidores em um arquivo chamado list.txt in cwd :

sed '/^server/{x;//!r list.txt
d}' /etc/ntp.conf

ou, se você não quiser usar um arquivo, mas sim codificar os novos nomes de servidor:

sed '/^server/{x;//!c\
server 1\
........\
server n-1\
server n
d}' /etc/ntp.conf

Isso pressupõe que haja pelo menos uma linha não comentada server em seu /etc/ntp.conf (também, não removerá nenhuma server linhas que estão comentados - você pode alterar o regex para incluir esses também). Se você quisesse inserir essas linhas mesmo se não houvesse entradas de servidor no arquivo original (e, nesse caso, adicionar os novos servidores no final do arquivo), você poderia fazer algo como:

sed '/^server/{x;//!r list.txt
d}
${x;//!r list.txt
x}' /etc/ntp.conf

ou use as mesmas condições, se você preferir usar c\ - deixarei isso como um exercício. Lembre-se de que ao alterar linhas com c\ , todas as barras invertidas e novas linhas incorporadas precisam ser escapadas com uma barra invertida (como no meu exemplo).

    
por 06.02.2017 / 15:15
0
sed '
/^server/ d
/first block/a\
server 5.5.5.5\
server 6.6.6.6\
server 7.7.7.7
' /etc/ntp.conf

altere apenas a primeira ocorrência:

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences
    
por 04.02.2017 / 20:37