Eu tenho que substituir um grande bloco de texto (código de script de shell) em um arquivo por outro bloco de texto.
Estou impressionado com o Como posso usar o sed para substituir uma string de várias linhas? respondidas por antak e Multi-line replace respondidas por Bruce Ediger
Mas tenho alguns problemas em usá-los.
O Antak já mencionou em sua resposta que o streaming de arquivo inteiro (
1h;2,$H;$!d;g;
) para o buffer não é aconselhável para arquivos grandes, porque sobrecarrega a memória.Eu sei que
sed
pode ser usado com o recurso de bloco para preservar o texto fora do bloco inalterado. Eu quero usar esse recurso. Mas se eu usar,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
ele irá inserir novo texto (código) repetidamente para cada fluxo. Portanto, eu tenho que fazer o bloco visual como um fluxo, usando algo semelhante ao sugerido por antak anteriormente, mas para o bloco (não para o arquivo inteiro).
Conforme mencionado por Bruce Ediger, é possível tentar o recurso de acréscimo
ex
que começa coma
final com.
(ponto), mas meu novo texto (código) contém linhas que começam com ponto, que pode ser considerado como o ponto da sintaxe de acréscimo. Como posso usá-lo nesta situação?ex
'sdd
' number of lines 'pode excluir várias linhas, mas se eu tiver um bloco entre / marker1 / e / marker2 / com o número de linhas não fixas (variando) será substituído por um novo texto (código), como fazer isto ?
sed
ou ex
comando funciona).
r
o comando read file para copiar o texto de outro arquivo, se a origem do texto de substituição estiver em um arquivo.