newContent='cat new_file'
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\n).*(\n### END GENERATED CONTENT)/\$newContent\/s" existing_file
Digamos que eu tenha um arquivo de texto como este:
# custom content section
a
b
### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT
Gostaria de substituir a parte entre as tags GENERATED CONTENT
pelo conteúdo de outro arquivo.
Qual é a maneira mais simples de fazer isso?
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
Atenção: Esta definitivamente não é a maneira mais simples de fazer isso. (EDIT: bash funciona; POSIX grep também está bom)
Se o texto principal estiver no arquivo "main" 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/\(.*\):.*//g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*//g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF