Inserindo arquivo em outro arquivo após padrão [duplicado]

0

Como posso inserir o conteúdo do arquivo a , seguido por uma nova linha, no arquivo b , após a primeira linha contendo PATTERN ?

    
por Toothrot 07.10.2018 / 10:30

2 respostas

2
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 .

    
por 07.10.2018 / 11:05
0

Que tal

sed '/PATTERN/r a' b
    
por 07.10.2018 / 11:16