Eu faria isso em Perl. Salve o e-mail e o nome de usuário associado do /etc/dovecot/dovecot.passwd
em um hash e substitua em /etc/mail/virtusertable
:
$ perl -i -ape 'BEGIN{
open($fh,"/etc/dovecot/dovecot.passwd");
while(<$fh>){ @G=split(/:/); $k{$G[0]}=$G[2]; }
}
s/error:nouser Account temporary disabled/$k{$F[0]}/ if defined $k{$F[0]};
' /etc/mail/virtusertable > newfile
Explicação
O -i
faz o perl editar seu arquivo de entrada, o mesmo que sed -i
. O -a
faz com que ele divida cada linha de entrada no espaço em branco na matriz @F
. Apenas como awk
. O -p
significa "imprimir todas as linhas depois de aplicar o script fornecido por -e
".
O próprio script lê /etc/dovecot/dovecot.passwd
no bloco BEGIN{}
(antes de ler o arquivo de entrada, /etc/mail/virtusertable
), divide cada linha em :
na matriz @G
e salva cada email como uma chave no hash %k
cujos valores são os nomes de usuários.
Quando terminar, ele processará /etc/mail/virtusertable
e substituirá cada error:nouser Account temporary disabled
pelo nome de usuário correspondente ao email no 1º campo se esse nome de usuário for definido.