sed '/pattern/{r file_b
a\
:f
n; b f
}' file_a
Se file_b
já tiver sido finalizado por uma nova linha e você não quiser uma linha vazia na saída, omita a linha a\
do script.
Na última linha, o :f
define um rótulo, n
lê uma nova linha (que será impressa automaticamente, pois a opção -n
não foi fornecida para sed
) e b f
ramifica para a f
label, criando um loop. Tudo isso para acrescentar file_b
somente após o padrão de correspondência de linha primeiro . Se você quiser acrescentar file_b
depois de cada linha correspondente a pattern
, é muito mais simples:
sed '/pattern/r file_b' file_a
Exemplo:
$ cat file_a
first
second
third
fourth
first
second
third
fourth
$ cat file_b
b1
b2
b3
$ sed '/second/{r file_b
:f n; b f }' file_a
first
second
b1
b2
b3
third
fourth
first
second
third
fourth
$ printf "x\ny\nz" >file_c
$ sed '/second/{r file_c
a
:f n; b f }' file_a
first
second
x
y
z
third
fourth
first
second
third
fourth
$ sed '/second/r file_b' file_a
first
second
b1
b2
b3
third
fourth
first
second
b1
b2
b3
third
fourth
Outra solução seria usar ed(1)
(que surpreendentemente não está disponível por padrão nas distribuições modernas de linux, apesar de ser mandado por POSIX e presente em todos os sistemas unix desde 45 anos ou mais):
echo '/pattern/r file_b
w' | ed file_a
Isso irá editar file_a
no lugar e acrescentar uma nova linha se houver alguma no final de file_b
; se você quiser que a saída seja gravada em outro arquivo, altere o w
para w output_file
.