Corresponder string EXATA no arquivo e atualizar o endereço IP

1

Há dois passos, primeiro verifique se existe o host no arquivo

Se tiver o arquivo:

# FILE: /etc/hosts:
192.168.0.10 srv-db srv-db-home
192.168.0.15 srv-db1
192.168.0.20 srv-db-2
192.168.0.20 srv-db-work srv-db-

Executa:

sed -n -e '/\<srv-db\>/p' /etc/hosts

Quais os resultados para:

192.168.0.10 srv-db
192.168.0.20 srv-db-2
192.168.0.20 srv-db-

Ele ignora o número no final, mas não ignora o traço ( - ).

Eu encontrei um monte de regex que funciona parcialmente ... como estes dois abaixo:

Corresponder a string exata usando grep

e

como para combinar a string exata usando 'sed'? Mas não a parte disso.?

A resposta abaixo do @steeldriver ajudou com isso:

awk '$NF == "srv-db"' /etc/hosts

Mas, ao atualizar o endereço IP, ele fica confuso, eis o código completo com o qual acedi:

sed -i -e "s/\(^ *[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\(\s*\)\<srv-db\>/192.168.9.9/" /etc/hosts

Ele deve atualizar apenas a primeira linha, mas atualiza os mesmos resultados acima.

Mas nenhum deles funcionou perfeitamente neste caso em particular.

    
por Evis 11.11.2016 / 15:07

1 resposta

2

A âncora de limite de palavras \> trata - como limite.

Se você sabe que não há espaço em branco à direita, pode ancorar até o final da linha /\<srv-db$/ - para permitir espaços em branco finais, você pode modificar isso para /\<srv-db[[:blank:]]*$/ ou /\<srv-db[[:space:]]*$/

Ou use awk e faça uma correspondência string :

awk '$NF == "srv-db"' /etc/hosts

Se você não puder necessariamente ancorar no final da linha (mesmo com espaços em branco à direita), será necessário construir uma expressão que (por exemplo) testa espaços em branco ou fim de linha (por exemplo, "limite de palavra sem hífen") por exemplo (usando o modo expressão regular estendida )

sed -En -e '/\<srv-db(\s|$)/p'

Se você pode usar perl (ou grep no modo PCRE), então possivelmente há opções mais elegantes, como

perl -ne 'print if /\bsrv-db(?![\w-])/'

ou

grep -P '\bsrv-db(?![\w-])'
    
por 11.11.2016 / 15:27