Esta questão e suas respostas mostram que o conteúdo de um arquivo existente ("processedFile") pode ser inserido em outro arquivo existente ("reposingFile") antes de um de seus padrões dentro, tal que:
sed -i -e '/pattern/r processedFile' receivingFile
Às vezes, esse conteúdo pode resultar de uma unidade de comando anterior e ainda não foi gravado.
Nesse ponto, é possível inserir o resultado da unidade de comando no receiveFile sem criar/escrever o arquivo processado?
Exemplo:
Digamos, pré -processamos someFile
da seguinte maneira (lendo seu conteúdo a partir da 4ª linha até o final do arquivo):
awk 'NR>3' someFile
Agora, sem escrever isso em um novo arquivo, queremos inseri-lo diretamente em receiveFile antes de um padrão tal que:
awk 'NR>3' someFile | <insertion commands>
PS: De preferência usando awk
ou sed
.
Com base no pedido de @RomanPerekhrest,
algumArquivo :
# 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
Pré-processando:
awk 'NR>3' someFile
:
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
recebimentoArquivo :
stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.
Não sei dizer se é portátil em todos os *NIX, dependendo da implementação. Está funcionando no meu Linux Debian.
TL;DR: use
/dev/stdin
como arquivo incluído, que é a entrada do sed e obterá a saída do comando antes do pipe, comoExemplo: conteúdo do arquivo de destino chamado
receivingFile
:Exemplo de entrada chamado
someFile
:Para inserir após o padrão:
Para inserir antes do padrão, reutilizando a resposta vinculada por OP e despejar na saída:
Para fazer o que foi pedido e também substituir o arquivo:
Novo conteúdo do receiveFile:
ATUALIZAÇÃO : conforme observado por @don_crissti, isso não funciona se o padrão for a última linha. Aqui está outro comando, adaptado de sua resposta à mesma pergunta vinculada! Algum outro comando é necessário para acomodar a adição temporária (e supressão por sed) da linha em branco extra. Esses dois funcionariam:
ou apenas (não precisando de bash e deixando
sed -i
para tratar o arquivo final):Veja a resposta vinculada para o código sed dividido em linha.
Basta usar
ex
, a forma de script especificada pelo POSIX devi
(que também é especificada pelo POSIX).Ou mais geralmente:
Com sed (GNU sed) 4.4