অন্য পাঠ্য ফাইলের সাথে চিহ্নিতকারীদের মধ্যে একটি পাঠ্য ফাইলের অংশটি কীভাবে প্রতিস্থাপন করবেন?


26

বলুন আমার কাছে এই জাতীয় পাঠ্য ফাইল রয়েছে:

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT

আমি GENERATED CONTENTট্যাগগুলির মধ্যে থাকা অংশটি অন্য কোনও ফাইলের সামগ্রীর সাথে প্রতিস্থাপন করতে চাই ।

এটি করার সহজ উপায় কী?

উত্তর:


36
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file

চমৎকার। sedশুধু আরও অনেক কিছু করতে পারেন s/.../...!
— দেবসোলার

হুমম আমার পক্ষে কাজ করে না, আমি কি এক লাইনে সেড কমান্ডটি রেখে দেব?
— lzap

3
r insert_fileকমান্ড তার লাইনে শেষ জিনিস হতে হবে। নোট করুন যে এর পরে সাদা অংশ বা মন্তব্যের অনুমতি নেই। কোডটি জিএনইউ ব্যবহার sedকরে --posixবিকল্পটি সক্ষম করার মাধ্যমে পরীক্ষা করা হয়েছিল এবং এটি প্রত্যাশার মতো কাজ করেছে, সুতরাং এটি কোনও পোস্টিক্সের সাথে সঙ্গতি রেখে কাজ করা উচিত sed।
— পিটার.ও

1
পবিত্র মলি, দারুণ! এটি আমার সেড অভিধানে যাচ্ছে! চমত্কারভাবে দরকারী এবং সুন্দরভাবে সহজ। ধন্যবাদ!
— ড্যানিয়েলস্মেডেগার্ডবুস

2
মনে রাখবেন যে কোনও স্থানের সম্পাদনাটির জন্য আপনাকে সেডের আউটপুট (উদাহরণস্বরূপ output=$(sed -e "..." existing_file)) ক্যাপচার করতে হবে এবং তারপরে দ্বিতীয় পাসে (উদাহরণস্বরূপ echo "$output" > existing_file) প্রতিস্থাপনটি সম্পাদন করা হবে যেহেতু আপনি যে ফাইলটি পড়ছেন তাতে পুনর্নির্দেশের চেষ্টা করার ফলে বিষয়বস্তু পড়ার আগে এটি কেটে যাবে।
— ক্রিস টঙ্কিনসন

4
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file

সুন্দর কাজ. আমার চেয়ে অনেক সহজ। :)
— ডাঃ কিট্টি

4

সতর্কতা: এটি করার সহজ উপায় এটি অবশ্যই নয়। (সম্পাদনা: বাশ কাজ করে; পসিক্স গ্রেপও ঠিক আছে)

যদি মূল পাঠ্যটি "প্রধান" ফাইলটিতে থাকে এবং উত্পন্ন সামগ্রীটি "জেন" ফাইলে থাকে তবে আপনি নিম্নলিখিতটি করতে পারেন:

#!/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বিড়ালের দ্বারা পড়ার আগে লেখার জন্য, এটি সাফ করার জন্য উন্মুক্ত হবে ।
— চিপনার

@ চেপনার ক্র্যাপ, ঠিক বলেছেন। বাকি কাজ, যদিও। আমি এটা ঠিক করব.
— ডাঃ কিট্টি

3
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF

একটি হেরডোক এবং এড লাইন সম্পাদক ব্যবহার করে। বংশের অভ্যন্তরের প্রথম লাইনটি '+' 'এর পরে' d 'লাইনটি' + '' পরে জেনারেটেড ... 'এবং' - 'এর আগে লাইনটি মুছে ফেলতে হবে -' ​​### শেষ জেনারেটেড ... 'দ্বিতীয় লাইন জেনারেটেড ... #
— জেটিসেল

দুঃখিত, আমি কী বলতে চাইছিলাম "### শুরু হয়েছে
— জেনারেটেড

লোকেদের কাছে এটি সহজ করে নিন, এটি আমার প্রথমবারের পরে :-)। এছাড়াও আমি শব্দটি একইভাবে ব্যবহার করতে পারি তবে অন্য সমাধানটি হেরডোকস ব্যবহার করে না তবে একটি প্রিন্টফ এবং পাইপ ব্যবহার করে। কোনও ভুল হলে আমি ক্ষমা
— চাইছি

ধন্যবাদ, খুব পঠনযোগ্য! বিটিডব্লিউ - এর পরিবর্তে r FILE2আপনি r !commandআলাদা স্ক্রিপ্ট থেকে পড়তে বলতে পারেন।
— কোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.