Jawaban:
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
perintah harus menjadi hal terakhir pada baris. Perhatikan bahwa spasi putih atau komentar tidak diizinkan setelahnya. Kode diuji menggunakan GNU sed
dengan --posix
opsi yang diaktifkan, dan itu berfungsi seperti yang diharapkan, jadi itu harus bekerja dengan setiap posix compliant sed
.
output=$(sed -e "..." existing_file)
) dan kemudian melakukan penggantian dalam pass kedua (mis. echo "$output" > existing_file
) Karena mencoba mengalihkan ke file yang Anda baca akan menyebabkannya terpotong sebelum konten dibaca.
Peringatan: Ini jelas bukan cara paling sederhana untuk melakukannya. (EDIT: bash berfungsi; POSIX grep juga baik-baik saja)
Jika teks utama di file "main" dan konten yang dihasilkan di file "gen", Anda bisa melakukan hal berikut:
#!/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
untuk menulis, membersihkannya, sebelum dibaca oleh kucing.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
Anda bisa mengatakan r !command
untuk membaca dari skrip yang berbeda.
sed
dapat melakukan lebih dari sekadars/.../...
!