Não sei dizer se é portável em todos os * NIX, dependendo da implementação. Está trabalhando no meu Linux Debian.
TL; DR: use /dev/stdin
como arquivo incluído, que é a entrada do sed e receberá a saída do comando antes do pipe, como
awk 'NR>3' someFile | sed -i -e '/pattern/r /dev/stdin' receivingFile
Exemplo: conteúdo do arquivo de destino chamado receivingFile
:
stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.
Exemplo de entrada chamado someFile
:
# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
Para inserir após o padrão:
awk 'NR>3' someFile | sed -e '/pattern/r /dev/stdin' receivingFile
Para inserir antes do padrão, reutilize o resposta vinculada por OP e dump para saída:
awk 'NR>3' someFile | sed -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
Para fazer o que foi solicitado e também substituir o arquivo:
awk 'NR>3' someFile | sed -i -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
Novo conteúdo de receiveFile:
stackExchange is the best.
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
pattern
Unix stackExchange is the best of the bests.
UPDATE : como observado por @don_crissti, isso não funciona se padrão for a última linha. Aqui está um outro comando, adaptado de sua resposta para a mesma questão ligada! Algum outro comando é necessário para acomodar a adição temporária (e a supressão por sed) da linha extra em branco. Estes dois funcionariam:
awk 'NR>3' someFile | sed -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile <(printf '\n') > receivingFile.new
mv receivingFile.new receivingFile
ou apenas (não precisando bash e deixando sed -i
para manipular o arquivo final):
awk 'NR>3' someFile | { echo '' >> receivingFile; sed -i -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile ; }
Veja o resposta vinculada para o código sed dividido em linha.