Como substituo TODO o texto de um arquivo após uma determinada linha pelo conteúdo de outro arquivo de texto, usando sed/awk?

Como substituo TODO o texto de um arquivo após uma determinada linha pelo conteúdo de outro arquivo de texto, usando sed/awk?

Atualmente, estou tentando automatizar a atualização do texto de um arquivo intitulado original_file.txt. Imagine que o arquivo se pareça com o seguinte:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

Este arquivo será atualizado removendo todo o texto após "Substituir tudo após esta linha" e substituindo-o pelo texto do arquivoarquivo_substituição.txt. Para fins de postagem, imagine que replacement_file.txt tenha o seguinte texto:

testing123
this_is_the_replacement_text

Pelo que consegui descobrir com o sed, só consigo descobrir como editar o resto da linha após uma determinada frase. Quero substituir o texto em original_file.txt após a frase de substituição por todo o texto de replacement_file.txt (quero manter o texto da linha de substituição para atualizações futuras). original_file.txt deve ficar assim no final:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Desde já, obrigado!

Responder1

No GNU/awk:

Nomeie os dois arquivos como argumentos.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

Responder2

Imprima todas as linhas até que a linha "substituir após" seja encontrada, depois leia outro arquivo e saia:

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • use sed -ipara salvar alterações
  • ou... > tmp && mv tmp original

Responder3

Usando sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

Os três sedblocos fazem isso:

  1. O primeiro bloco imprime todas as linhas da linha 1 até a linha com o conteúdo especial. Eu imprimo essas linhas explicitamente com pe depois invoco dpara forçar o início de um novo ciclo (" print; next" in awk).
  2. Após as linhas iniciais terem sido geradas pelo primeiro bloco, o segundo bloco gera o conteúdo do arquivo extra.
  3. O script de edição é então finalizado.

Normalmente, qno terceiro bloco seria gerada a linha atual antes de sair (esta seria a linha no exemplo data reading text_that_will), mas como sedé invocado com -n, esta saída padrão de uma linha no final de um ciclo é inibida.

O resultado do comando acima, dados seus dados, é

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Para atualizar o arquivo original, você pode usar sed -i ...ou redirecionar a saída para um novo arquivo que você substitui o original por:

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

Responder4

se estiver usando gnu Awk:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

informação relacionada