Respostas:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
comando deve ser a última coisa em sua linha. Observe que nem espaço em branco nem comentários são permitidos depois dele. O código foi testado usando o GNU sed
com a --posix
opção ativada e funcionou como esperado, portanto, deve funcionar com qualquer posix compatível sed
.
output=$(sed -e "..." existing_file)
) e execute a substituição em uma segunda passagem (por exemplo echo "$output" > existing_file
), pois tentar redirecionar para um arquivo do qual você está lendo fará com que ele trunque antes da leitura do conteúdo.
Aviso: Definitivamente, essa não é a maneira mais simples de fazer isso. (EDIT: bash funciona; POSIX grep também é bom)
Se o texto principal estiver no arquivo "principal" e o conteúdo gerado estiver no arquivo "gen", você poderá fazer o seguinte:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
para escrita, limpando-a, antes de ser lida pelo gato.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
você pode dizer r !command
para ler de um script diferente.
sed
pode fazer muito mais do que apenass/.../...
!