ফাইলগুলিতে মাল্টলাইন স্ট্রিং প্রতিস্থাপন করুন


17

আমার একাধিক ফাইল রয়েছে যা আমি একাধিক মাল্টি-লাইনের স্ট্রিংয়ের সাথে একাধিক-লাইন স্ট্রিং প্রতিস্থাপন করে আপডেট করতে চাই। এর লাইন ধরে কিছু:

* Some text, 
* something else
* another thing

এবং আমি এটি দিয়ে প্রতিস্থাপন করতে চাই:

* This is completely
* different text

ফলাফলটি হ'ল প্রতিস্থাপনের পরে পাঠ্যের প্রথম ব্লকযুক্ত ফাইলটিতে এখন দ্বিতীয় স্ট্রিং থাকবে (ফাইলটির বাকী অংশটি অপরিবর্তিত রয়েছে)।

সমস্যার অংশটি হ'ল ফাইল সিস্টেমে আপডেট হওয়া ফাইলগুলির তালিকা আমাকে খুঁজে বের করতে হবে। আমি অনুমান করি যে এর জন্য আমি গ্রেপ ব্যবহার করতে পারি (যদিও এটি মাল্টলাইন স্ট্রিংগুলির সাথে করা এত সহজ নয়) তবে সম্ভবত সেডে পাইপ করব?

এটি করার কোনও সহজ উপায় আছে? শেড একটি বিকল্প তবে এটি বিশ্রী কারণ আমাকে \ n যোগ করতে হবে ইত্যাদি there "এই ফাইলটি থেকে ইনপুট নিন, সেই ফাইলগুলিতে এটি মেলাবেন, তারপরে এই অন্যান্য ফাইলের সামগ্রীর সাথে এটি প্রতিস্থাপন করুন"? প্রয়োজনে আমি পাইথন ব্যবহার করতে পারি, তবে আমি দ্রুত এবং সাধারণ কিছু চাই, তাই যদি কোনও ইউটিলিটি উপলব্ধ থাকে, তবে আমি বরং এটি আমার নিজের স্ক্রিপ্ট লেখার চেয়ে ব্যবহার করব (যা আমি কীভাবে করতে জানি)।


আপনার সম্ভবত এটির জন্য পার্ল ব্যবহার করা উচিত। stackoverflow.com/questions/1030787/…
প্রাচীর

3
সুতরাং আপনি some text, something else another thingএটি একাধিক লাইন বিস্তৃত কিনা তা মেলতে চান? নাকি আপনি কেবল মেলাতে চান some text,\nsomething else\nanotherthing?
মাইক্রজারভ

2
আপনার প্রশ্নটি সম্পাদনা করুন এবং প্রতিটি ফাইল (গুলি) এর সামগ্রী কী এবং পছন্দসই আউটপুট কী তা পরিষ্কার করুন।
জিম্মিজ

স্ট্রিং একাধিক লাইন বিস্তৃত। মিলে / প্রতিস্থাপন করার সময় আমি সাদা স্থানটিকে উপেক্ষা করি কারণ এটি সমস্ত একদম একরকম নাও হতে পারে, তবে আমি 1-1 ম্যাচ (নিউলাইনস এবং সবগুলি) করলে এটি কোনও বড় বিষয় নয়।
ventsyv

উত্তর:


12

এক বা একাধিক ইনপুট ফাইলগুলিতে "নতুন" ফাইলের বিষয়বস্তু দ্বারা "কিছু ... ... n ... জিনিস" প্রতিস্থাপন করুন

perl -i -p0e 's/Some.*?thing\n/`cat new`/se' input.txt ...
  1. -i ইনপুট.টিএসটি সরাসরি পরিবর্তন করতে
  2. -p0 স্লুর্প ইনপুট ফাইল ফাইল এবং শেষ পর্যন্ত এটি মুদ্রণ
  3. s/regexp/.../s regexp .হয়.|\n
  4. s/.../exp/e দ্বারা পরিবর্তীত eval(exp)
  5. নতুন - প্রতিস্থাপন পাঠ্যযুক্ত একটি ফাইল (এটি সম্পূর্ণ ... বিভিন্ন পাঠ্য)
  6. দরকারী যদি আপনি মূল পাঠ্য প্রসারিত করতে পারেন s/Some text\n...\n...thing\n/...

সেই ফাইলটির (বহু-লাইন) বিষয়বস্তু সন্ধান করতে "আগে" বলে একটি ফাইল দিয়ে আমি কীভাবে তা করতে পারি? আমি চেষ্টা করেছি কিন্তু কাজ করে না।
কেভোথ

@ কেওহোথ, আমাদের আরও বিশদ দরকার ... ধরে নেওয়া যায় যে "আগে" এর কোনও বিশেষ অক্ষর নেই, আপনি চেষ্টা করতে পারেনperl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
জেওআও

এবং "পূর্বে" ধরে ধরে 'এবং' বাদে সমস্ত বিশেষ অক্ষর (নতুন লাইন, স্ল্যাশ, বন্ধনী) রয়েছে `
কেভোথে

5
sed -e :n -e '$!N;/\n.*\n/!{$!bn
};  s/some text,\n* *something else\n* *another thing/this is completely\
different text/;P;D' <infile

আমি আশঙ্কা করি যে সমস্যার সমাধানের জন্য আপনার পক্ষে উপযুক্ত একটি সমাধান নিয়ে আসতে আপনার সমস্যা হতে চলেছে, যতক্ষণ না আপনি সমস্যার একটি নিবিড় বিবরণ হাতুড়ি করে না - তবে এটিই কিউএর পক্ষে সবচেয়ে উপযুক্ত, কারণ আমি এটি দেখছি। সম্ভবত এটি আপনাকে ধারণা দেবে - ইনপুট ফাইলটিতে একবারে কেবল একটি লাইন এগিয়ে যাওয়ার সময় - এটি একবারে 3 লাইন একসময় প্যাটার্ন স্পেসে রাখে।

এটি আপনার স্ট্রিংয়ের সাথে একাধিক লাইন বিস্তৃত হোক বা না হোক - তিনটি পর্যন্ত তা মেলাতে সক্ষম হবে। তবে প্রতিস্থাপনে সেই বিধানটি মিরর করার কোনও বিধান নেই - এটি সর্বদা লিখিতভাবে দুটি লাইন বিস্তৃত করে।


0

শক্তিশালী নয় (কারণ দ্বিতীয় স্ট্রিং চেচবেন না তবে এটি নিষ্পত্তি করা সহজ) এবং এটি পিক্সিক সংকলন নয় তবে খুব সহজ হতে পারে:

sed '/^Some text/{:1;/another thing$/!{N;b 1}
     s/.*/this is completely\ndifferent text/g}' input.txt

প্রথম কমান্ড কোনও পাঠ্য থেকে অন্য কোনও জিনিস না পাওয়া পর্যন্ত লাইন যুক্ত করে দ্বিতীয় লাইনে এটি অন্য পাঠ্যে পরিবর্তন করে।

দ্রষ্টব্য সীমাবদ্ধতা হ'ল কিছু পাঠ্য সর্বদা অন্য জিনিস অনুসরণ করা উচিত ।


সমস্যা হলো স্ট্রিং চেয়ে বেশি 2 লাইন যেমন ট্যাব হিসাবে হতে পারে (এক ডজন বা পর্যন্ত) এবং অন্যান্য উপাদান থাকতে পারে যে পলান করা যথাসাধ্য প্রয়োজন হয়, * ইত্যাদি
ventsyv

@ এভেনটিসিভ লাইন বা বিভাজকের সংখ্যা নিয়ে কোনও সমস্যা নেই - স্ক্রিপ্টটি কেবল শুরু এবং শেষ পরীক্ষা করে। এটি স্ট্রিংটি বাহ্যিকভাবে পাঠ্য পরিবর্তন করতে চিহ্নিত করতে পারলে এটি বেশ ধারণা করা হয় । যদি আপনার ভাল না হয় তবে সঠিক প্যাটার্ন উত্পাদন করতে ইনপুট উদাহরণ দিন।
কস্টাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.