Um script awk
direto:
awk '
/^client/ { ipaddr = $2 }
/^[[:blank:]]*shortname/{ shortname = $3 }
/^[[:blank:]]*secret/ { secret = $0; sub("^[^=]*= ", "", secret) }
/^}/ {
printf("client %s { secret = %s, ipaddr = %s }\n",
shortname, secret, ipaddr);
}' file
Simplesmente analise os bits de informação necessários quando os encontramos no arquivo de entrada, e quando atingimos um }
no início de uma linha, geramos as informações coletadas no formato correto.
A análise do texto secret
é especial, pois esperamos que ele contenha qualquer coisa , mesmo delimitadores de campo. Ele simplesmente começa definindo a variável secret
para a linha inteira e, em seguida, exclui tudo até o primeiro =
e o espaço único a partir de então.
Dado o arquivo
client 192.168.100.2 {
secret = ThisIStheSECRET2
shortname = HOSTNAME2
}
client 10.0.0.1 {
secret = This is it, the secret!, ipaddr = 10.0.0.1
shortname = myhost.local
}
(observe quatro espaços no início do segredo), isso produz
client HOSTNAME2 { secret = ThisIStheSECRET2, ipaddr = 192.168.100.2 }
client myhost.local { secret = This is it, the secret!, ipaddr = 10.0.0.1, ipaddr = 10.0.0.1 }