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


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.