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>