Risposte:
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 essere l'ultima cosa sulla sua riga. Si noti che non sono consentiti né spazi bianchi né commenti. Il codice è stato testato usando GNU sed
con l' --posix
opzione abilitata e ha funzionato come previsto, quindi dovrebbe funzionare con qualsiasi posix compatibile sed
.
output=$(sed -e "..." existing_file)
) e quindi la sostituzione in un secondo passaggio (ad esempio echo "$output" > existing_file
) poiché il tentativo di reindirizzare in un file da cui stai leggendo lo farà troncare prima che i contenuti vengano letti.
Attenzione: questo non è sicuramente il modo più semplice per farlo. (EDIT: bash funziona; anche POSIX grep va bene)
Se il testo principale è nel file "principale" e il contenuto generato è nel file "gen", è possibile effettuare le seguenti operazioni:
#!/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
per la scrittura, cancellandola, prima che venga letta dal gatto.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
te puoi dire r !command
di leggere da una sceneggiatura diversa.
sed
può fare molto di più di un semplices/.../...
!