অন্যান্য ফাইলের বিষয়বস্তু সহ কোনও ফাইলের মধ্যে বিকল্প প্যাটার্ন


20

আমার কাছে একটি পাঠ্য ফাইল রয়েছে ( devel.xml)।

এই স্ট্রিংটিকে একটি ভিন্ন ফাইলের ( temp.txt) এর মধ্যে থাকা সামগ্রীর সাথে প্রতিস্থাপনের জন্য আমি এতে REPLACETHIS শব্দ যুক্ত করেছি ।

আমার নিকটতম জিনিসটি হ'ল:

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

এটি স্ট্রিংয়ের পরে সামগ্রীটি সন্নিবেশ করায় এবং তারপরে স্ট্রিংটি মুছবে।

এটি কি এটি সেরা উপায়?


এটি কি সেড করা আছে? টেম্প টেক্সটে কত পাঠ্য রয়েছে তার উপর নির্ভর করে আমি পার্ল সমাধানে যেতে পারি।
ব্যবহারকারী17591

উত্তর:


34

আপনি যা করেছেন তা SUBSTITUTETHISফাইলের যেখানেই প্রদর্শিত হবে সরিয়ে ফেলা (তবে এটি যেখানে প্রদর্শিত হবে সেখানে বাকী রেখার নয়) এবং temp.TXTসেই লাইনের নীচে থাকা সামগ্রী .োকানো। যদি SUBSTITUTETHISকোনও লাইনে একাধিকবার উপস্থিত হয়, কেবলমাত্র প্রথম ঘটনাটি সরানো হবে, এবং কেবলমাত্র একটি অনুলিপি temp.TXTযুক্ত করা হবে।

আপনি SUBSTITUTETHISউপস্থিত হওয়ার সাথে সাথে যদি পুরো লাইনটি প্রতিস্থাপন করতে চান তবে dকমান্ডটি ব্যবহার করুন । যেহেতু আপনার উভয় চালানো প্রয়োজনr এবং dযখন কোনও মিল আছে, তখন তাদের একটি ব্রাসেড গ্রুপে রাখুন।

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

কিছু সেড বাস্তবায়ন আপনাকে কমান্ড পৃথক করতে সেমিকোলন ব্যবহার করতে দেয় এবং ব্রেসগুলির চারপাশে পুরোপুরি বিভাজক বাদ দিতে পারে তবে তবুও আপনার যুক্তিটি শেষ করতে একটি নতুন লাইন দরকার r কমান্ডের সাথে :

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

আপনি যদি প্রতিস্থাপন করতে চান SUBSTITUTETHIS ফাইলটির বিষয়বস্তু দ্বারা তবে লাইনের আগে এবং পরে যা আসে তা ধরে রাখুন, এটি আরও জটিল। সহজ পদ্ধতিটি হ'ল সেড কমান্ডের মধ্যে ফাইলের বিষয়বস্তু অন্তর্ভুক্ত করা; নোট করুন যে আপনাকে এর বিষয়বস্তুগুলি সঠিকভাবে উদ্ধৃত করতে হবে।

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

অথবা পার্ল ব্যবহার করুন। এটি সংক্ষিপ্ত তবে রানcat প্রতিটি প্রতিস্থাপনের জন্য একবার :

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

স্ক্রিপ্ট শুরু হয়ে গেলে একবার ফাইলটি পড়তে, এবং শেল কমান্ডের উপর নির্ভর করে এড়াতে:

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(পাঠযোগ্যতার জন্য দুটি লাইনে উপস্থাপন করা তবে আপনি লাইন ব্রেকটি বাদ দিতে পারেন)। যদি ফাইলের নামটি পরিবর্তনশীল হয় তবে সমস্যাগুলি উদ্ধৃতি এড়ানোর জন্য, পরিবেশের ভেরিয়েবলের মাধ্যমে স্ক্রিপ্টে এটি প্রেরণ করুন:

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

আমি পার্ল কমান্ডটি কীভাবে পরিবর্তন করতে পারি যাতে পরিবর্তে cat temp.txtআমি করতে পারি cat ${variable}?
মারিয়া ইনেস পরনসারি

@ মারিয়াআইনেস পার্নিশারী মন্তব্য ফর্ম্যাটিংয়ে আমি একটি ভুল করেছি। আমার উত্তরটি দেখুন, কিছুটা আলাদা, আরও দৃ rob় সমাধানের সাথে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

যেহেতু ফাইল :: স্লুর্প সর্বদা ইনস্টল করা হয় না, তাই বিকল্পটি হ'ল -0777পুরো ফাইলে openperl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
স্লার্পের

r temp.TXT"BEGIN টেম্প.টিএক্সটি", "এন্ড টেম্প। টিএক্সএক্স"
kyb

আমি আমার প্রশ্নের সমাধান পেয়েছি। a(অ্যাড) কমান্ড ব্যবহার করুন। grymoire.com/Unix/Sed.html#uh-36
kyb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.