উত্তর:
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
কমান্ড তার লাইনে শেষ জিনিস হতে হবে। নোট করুন যে এর পরে সাদা অংশ বা মন্তব্যের অনুমতি নেই। কোডটি জিএনইউ ব্যবহার sed
করে --posix
বিকল্পটি সক্ষম করার মাধ্যমে পরীক্ষা করা হয়েছিল এবং এটি প্রত্যাশার মতো কাজ করেছে, সুতরাং এটি কোনও পোস্টিক্সের সাথে সঙ্গতি রেখে কাজ করা উচিত sed
।
output=$(sed -e "..." existing_file)
) ক্যাপচার করতে হবে এবং তারপরে দ্বিতীয় পাসে (উদাহরণস্বরূপ echo "$output" > existing_file
) প্রতিস্থাপনটি সম্পাদন করা হবে যেহেতু আপনি যে ফাইলটি পড়ছেন তাতে পুনর্নির্দেশের চেষ্টা করার ফলে বিষয়বস্তু পড়ার আগে এটি কেটে যাবে।
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
সতর্কতা: এটি করার সহজ উপায় এটি অবশ্যই নয়। (সম্পাদনা: বাশ কাজ করে; পসিক্স গ্রেপও ঠিক আছে)
যদি মূল পাঠ্যটি "প্রধান" ফাইলটিতে থাকে এবং উত্পন্ন সামগ্রীটি "জেন" ফাইলে থাকে তবে আপনি নিম্নলিখিতটি করতে পারেন:
#!/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
বিড়ালের দ্বারা পড়ার আগে লেখার জন্য, এটি সাফ করার জন্য উন্মুক্ত হবে ।
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
আপনি r !command
আলাদা স্ক্রিপ্ট থেকে পড়তে বলতে পারেন।
sed
শুধু আরও অনেক কিছু করতে পারেনs/.../...
!