
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 -i
para 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 sed
blocos fazem isso:
- O primeiro bloco imprime todas as linhas da linha 1 até a linha com o conteúdo especial. Eu imprimo essas linhas explicitamente com
p
e depois invocod
para forçar o início de um novo ciclo ("print; next
" inawk
). - Após as linhas iniciais terem sido geradas pelo primeiro bloco, o segundo bloco gera o conteúdo do arquivo extra.
- O script de edição é então finalizado.
Normalmente, q
no 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