Com sed provavelmente você pode fazer:
sed 's|[^:]*:\([^:]*\).*|/^[^:]*::/s/$/:&/;t|' file2 | sed -f - file1
... o que envolveria um processo sed lendo o segundo arquivo e escrevendo um script sed para editar o primeiro em um segundo stdin sed . Tão perto quanto eu posso dizer que você não deve ter nenhum problema com a injeção direta do conteúdo textualmente em um regexp como esse. Se houver a possibilidade de metacaracteres na entrada, há muitas respostas neste site que discutem os meios de escapar delas. Se for necessário, no entanto, o seguinte seria suficiente:
sed 's|[]&\./*[]|\&|g;s|...' ... | sed -f - file1
Ainda assim, provavelmente, o epônimo join é a melhor solução - isso é apenas para demonstrar como fazer isso com sed porque você o mencionou.
De qualquer forma, o script que o segundo sed se aplica a file1 acaba parecido com (com uma linha semelhante à abaixo para cada linha no arquivo2) :
/^[^:]*:Dillain:/s/$/:R:Dillain:bodent/;t
... o que significa que se encontrar uma linha correspondente a Dillain para o segundo campo delimitado por dois pontos, então deve acrescentar a string : R: Dillain: bodent para a cauda. Como provavelmente não faz sentido continuar a tentar corresponder uma linha em file1 se uma linha de file2 já tiver sido anexada, o comando t est de finalização apenas removerá qualquer substituição bem-sucedida assim que estiver concluída. / p>