একাধিক অনুসন্ধান এবং একটি বড় পাঠ্য ফাইলে ক্রিয়া প্রতিস্থাপন


11

আমার কাছে একটি বড় পাঠ্য ফাইল রয়েছে (প্রায় 2 গিগাবাইট)। আমি একই ফাইলটিতে পাঁচটি অনুসন্ধান এবং ক্রিয়া প্রতিস্থাপন করতে চাই এবং এটি একটি কমান্ডে করতে চাই to সাধারণত আমি ভিএম ব্যবহার করি, ফাইলটি ওপেন করি, তারপরে একটি ক্রিয়া করি, তারপরে পরের ইত্যাদি There এখানে একটি ধরা আছে, যেমন আমি লক্ষ্য করেছি যে স্মৃতি সমস্যার কারণে তিন বা চারটি অনুসন্ধানের পরে ভিএম ক্র্যাশ হয়।

আমি ভিমে যে কমান্ডটি ব্যবহার করি তার দুটি উদাহরণ এখানে রয়েছে:

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

এই হ্যান্ডেল করার সেরা উপায় কি?

উত্তর:


8

আমি এইভাবে সেড ব্যবহার করব:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

-iবিকল্পটি "জায়গায়" প্রতিস্থাপনের জন্য দাঁড়িয়েছে। আপনি এই বিকল্পটিতে একটি এক্সটেনশান সরবরাহ করে আপনার ফাইলের একটি ব্যাকআপ তৈরি করতে সেডকে বলতে পারেন ( -i.bakyourfile.txt হিসাবে yourfile.txt ব্যাকআপ করবে)।


তাড়াতাড়ি! কেবলমাত্র আপনার উত্তর ;-) নয়, 5 টি অনুসন্ধান এবং প্রতিস্থাপন সহ এই স্ক্রিপ্টটি ভিএম-তে কেবল ফাইলটি খোলার সাথে প্রায় 10x দ্রুত। যদিও একটা জিনিস আমাকে বিভ্রান্ত করেছে। প্রথমে আমি ভাবলাম .bak ফাইলটি সম্পাদিত ফাইল হবে তবে এটি অবশ্যই আসল।
এসপিআরবিএনএন

একসাথে 2 জিবি ফাইলে দশটি অনুসন্ধান এবং ক্রিয়াকলাপ (হাজার হাজার হিট) প্রতিস্থাপন করুন, কোনও স্মৃতি সমস্যা নেই। গড় ডেস্কটপে দুই মিনিটেরও কম - সুপার!
এসপিআরবিএনএন

একটি প্রশ্ন ... আপনি প্রতিস্থাপনের স্ট্রিংয়ের বিন্দুগুলি থেকে পালাতে পারেন। এটি কি প্রয়োজনীয়?
এসপিআরবিএনএন

1
আপনাকে স্বাগতম! Rxt :) আসলে, আপনি ঠিক বলেছেন, আপনি প্রতিস্থাপনের স্ট্রিং-এ অ-পালিত বিন্দুগুলি ব্যবহার করতে পারেন sed। আমি চেষ্টা করেছি, এবং এটি কার্যকর। ইউনিক্স এবং লিনাক্স স্ট্যাকেক্সচেঞ্জে একটি ভাল থ্রেড রয়েছে এবং স্বীকৃত উত্তরে বিন্দুগুলিকে পালাতে অক্ষর হিসাবে উল্লেখ করা হয়নি।
ssssteffff

2
@ rxt আপনি বলেছেন স্ট্রিং প্রতিস্থাপন করুন , দুঃখিত, আপনার সেখান থেকে পালানোর দরকার নেই।
টেরডন

6

আপনার যদি আরও অনেক সন্ধানের ধরণ থাকে তবে আপনি এগুলি একটি ফাইলে সংরক্ষণ করতে পারেন এবং সেখান থেকে বিকল্পগুলি পড়তে পারেন। উদাহরণস্বরূপ, বলুন যে এগুলি এর বিষয়বস্তু replacements.txt:

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

তারপরে আপনি এন প্রতিস্থাপনের একটি তালিকা পড়তে পারেন এবং এগুলি দিয়ে প্রতিস্থাপন করতে পারেন:

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

মন্তব্য:

  • এটি ধরে নিয়েছে যে আপনার অনুসন্ধানের স্ট্রিংগুলিতে ফাঁকা স্থান নেই এবং কোনও অদ্ভুত অক্ষরকে এড়িয়ে চলা দরকার replacements.txt
  • এটি sedপ্রতিস্থাপনের জন্য একটি চালাবে যা আপনার যদি অনেকগুলি প্রতিস্থাপনের কাজ করে তবে কিছুক্ষণ সময় নিতে পারে।
  • যতক্ষণ না আপনি কিছুটা বেশি সময় নেবেন তাতে আপত্তি না রাখলে এটি একটি স্বেচ্ছাসেবী প্রতিস্থাপনের (হাজার হাজার বা কয়েক মিলিয়ন বা যাই হোক না কেন) মোকাবেলা করতে পারে।

অন্য বিকল্পটি sedস্ক্রিপ্ট হিসাবে উপরেরটি লিখতে হবে :

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

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

sed -f replace.sed infile.txt 

, অন্য বিকল্প '' এর জন্য +1। প্রতিস্থাপন একটি ফাইলে রাখা সহজ হতে পারে! (আমি আশা করি আমি এটি মনে রাখব ...)
এমপি

"অন্যান্য বিকল্পের" জন্যও +1 কারণ এটি কাস্টম স্ক্রিপ্টের চেয়ে দেশীয় কার্যকারিতা ব্যবহার করে, তাই বেশি বহনযোগ্য / ভাগ করে নেওয়া যায়
ডেভিড কুক

@ ডেভিডকুক ধন্যবাদ, তবে এটি অন্যের চেয়ে দেশীয় বা বহনযোগ্য নয়। প্রথম পদ্ধতিটি পসিক্স শেল লুপ ব্যবহার করছে, এটি দ্বিতীয়টির মতো ঠিক বহনযোগ্য। এটি শেল লুপ ব্যবহার করার কারণে এটি আরও ধীর হবে।
টেরডন

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