जवाबों:
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/.../...
!