Procura padrão em um arquivo e substitui substring na coluna inline

0

Abaixo está o extrato do arquivo a ser alterado: Pode usar o awk ou o sed ... qualquer utilitário é bom para correspondência de padrões.

rhts-mgr hostname                       g05-rhts01
rhts-mgr ntp-server-ip-addr             10.113.XX.31
rhts-mgr ntp-redundant-server-ip-addr   10.113.XX.32
rhts-mgr extern-iface ip-addr           10.113.XX.129
rhts-mgr extern-iface broadcast-addr    10.113.XX.255
rhts-mgr extern-iface default-gw        10.113.XX.1

Eu tentei variações de combinações de awk e sed, mas ainda sou novo nisso. Estou tentando alterar as entradas de arquivo acima para abaixo

rhts-mgr hostname                       g08-rhts01
rhts-mgr ntp-server-ip-addr             10.113.55.31
rhts-mgr ntp-redundant-server-ip-addr   10.113.55.32
rhts-mgr extern-iface ip-addr           10.113.55.129
rhts-mgr extern-iface broadcast-addr    10.113.55.255
rhts-mgr extern-iface default-gw        10.113.55.1

A lógica é:

  1. pesquise o nome do host rhts-mgr na entrada e substitua anyhostname em $ 3 de g * -rhts * para g08-rhts *.
  2. substitua a sub-rede no endereço IP apenas no terceiro octeto: exemplo de 10.113.XX.31 para 10.113.55.31

Algo como abaixo ajudaria

awk '/^rhts-mgr hostname/ {<replace $3 with g08-rhts[0-9][0-9]>}; print}' file
awk '/^rhts-mgr extern-iface ip-addr/ {<replace $4 10.113.XX.129 with 10.113.55.129>}; print}' file

Eu tenho mais de 100 arquivos para editar com cada arquivo com essa edição. Por isso, seria ótimo se pudéssemos ter um processamento de texto mais rápido fazendo toda a varredura de substituição de um arquivo e substituindo-o durante essa varredura.

    
por Roy M 24.10.2017 / 03:44

1 resposta

2

sed :

sed -E '
  s/^(rhts-mgr hostname +g)[0-9]+(\-rhts.*)$/8/;
  s/^(rhts-mgr.* 10\.113\.)[0-9]+(\..*)$/5/;
  s/^(rhts-cntrl.* 10\.113\.)[0-9]+(\..*)$/3/
' file

Perl:

perl -ne '
  s/^(rhts-mgr hostname\s+g)\d+(\-rhts.*)$/${1}08${2}/;
  s/^(rhts-mgr.* 10\.113\.)\d+(\..*)$/${1}55${2}/;
  s/^(rhts-cntrl.* 10\.113\.)\d+(\..*)$/${1}53${2}/;
  print
' file
    
por 24.10.2017 / 05:22