Yanıtlar:
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
Komut kendi satırında son şey olmalı. Boşluğa veya yorumlara bundan sonra izin verilmediğini unutmayın . Kod GNU kullanılarak test edilmiştir sed
ile --posix
seçeneği etkin ve beklendiği gibi herhangi biriyle çalışmalıdır yüzden çalıştı POSIX uyumlu sed
.
output=$(sed -e "..." existing_file)
) çıktısını yakalamanızı ve ardından ikinci bir geçişte (örn. echo "$output" > existing_file
) Değiştirme işlemini gerçekleştirmenizi gerektirir, çünkü okuduğunuz bir dosyaya yönlendirmeyi denemek içeriği okumadan önce kesmesine neden olur.
Uyarı: Bu kesinlikle bunu yapmanın en kolay yolu değil. (EDIT: bash çalışır; POSIX grep de iyidir)
Ana metin "main" dosyasında ve oluşturulan içerik "gen" dosyasındaysa, aşağıdakileri yapabilirsiniz:
#!/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
kedi tarafından okunmadan önce yazmak, temizlemek için açılıyor .
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
için söyleyebilirsiniz r !command
.
sed
sadece çok daha fazlasını yapabilirs/.../...
!