আমি এই প্রশ্নের দিকে তাকিয়ে ছিলাম এবং তখন ভাবছিলাম যে আমি কীভাবে আমার উত্তরটিsed
কার্যকর করতে পারি যা নিখুঁতভাবে পসিক্স
ex
ব্যবহার
করে
।
কৌশলটি হ'ল sed
আমি হোল্ড স্পেসটির সাথে প্যাটার্ন স্পেসের সাথে তুলনা করতে পারি যে তারা ঠিক সমান (যদি
G;/^\(.*\)\n\1$/{do something}
) হয় তবে আমি এ জাতীয় পরীক্ষা করার কোনও উপায় জানি না ex
।
আমি জানি যে ভিমে আমি Y
প্রথম লাইনটি আঁকতে পারি এবং তারপরে আমি যা নির্দিষ্ট করে যাচ্ছিলাম তা প্রায় টাইপ
:2,$g/<C-r>0/d
করতে পারি — তবে প্রথম লাইনে খুব সরল অক্ষরযুক্ত লেখা ছাড়া কিছু থাকলে এটি প্রকৃতপক্ষে পরিণত হয়, যেহেতু রেখাটি রেজেক্স হিসাবে ফেলে দেওয়া হচ্ছে
, তুলনার জন্য কেবল একটি স্ট্রিং নয়। (এবং যদি প্রথম লাইনে একটি ফরোয়ার্ড স্ল্যাশ থাকে তবে বাকী রেখাটি একটি কমান্ড হিসাবে ব্যাখ্যা করা হবে!)
সুতরাং আমি যদি সেই সমস্ত লাইন মুছে ফেলতে চাই myfile
তবে প্রথম লাইনের অনুরূপ — তবে প্রথম লাইনটি মুছতে না পারি using আমি কীভাবে এটি ব্যবহার করে করতে পারি ex
? এই বিষয়টির জন্য, আমি কীভাবে এটি ব্যবহার করে করতে পারি vi
?
কোনও লাইনটি অন্য লাইনের সাথে হুবহু মিলে গেলে মুছার কোনও পসিক্স উপায় আছে?
সম্ভবত এই কল্পিত সিনট্যাক্স এর মতো কিছু:
:2,$g/**lines equal to "0**/d
sed
একটি ফিল্টার হিসাবে কেবল অভ্যন্তর থেকে ব্যবহার করা ex
এবং আমার পুরো sed
উত্তরটি পুরো বাফারে চালানো ... যা অবশ্যই কাজ করবে (এবং আসলে এটির বিপরীতে রয়েছে sed -i
)।
<C-r>0
খুব ভাল সঙ্গে খুঁজে । আমি নিশ্চিত না যে আপনি কেবলমাত্র প্রাক্তন কমান্ড দিয়ে আরও ভাল করতে পারবেন কারণ আপনাকে বিশেষ অক্ষরগুলি রক্ষা করতে হবে। পসিক্স আনুগত্যের সীমাবদ্ধতা ব্যতীত আমি মনে করি আপনি খুব অলৌকিক সুইচটি ব্যবহার করবেন \V
এবং তারপরে আপনি ব্যাকস্ল্যাশটিকে সুরক্ষিত করবেন (কারণ এটি এর সাথে তার বিশেষ অর্থ রাখে \V
) escape()
যার দ্বিতীয় তর্কটি এমন একটি স্ট্রিং যার মধ্যে আপনি পালাতে চান / সুরক্ষা চান ।
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
বা আপনি অর্ধিকলের মতো প্যাটার্ন ডিলিমিটারের জন্য অন্য একটি অক্ষর ব্যবহার করতে পারেন। এক্ষেত্রে আপনার প্যাটার্নে ফরোয়ার্ড স্ল্যাশ রক্ষা করার প্রয়োজন হবে না। এটি এমন কিছু দেবে::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
খুব ভাল সঙ্গে আপনার দ্বিতীয় পদ্ধতির খুঁজে । ভিমের সাথে, আপনি প্রায়শই অন্যান্য প্রোগ্রামগুলিতে কিছু বিশেষ কাজগুলি অর্পণ করেন এবং sed
সম্ভবত এটির একটি ভাল উদাহরণ। যাইহোক, sed
আপনার পুরো বাফারটি চালাতে হবে না । আপনি যদি এটি কেবল বাফারের একটি অংশে চালাতে চান তবে আপনি একটি পরিসর দিতে পারেন। উদাহরণস্বরূপ, যদি আপনি 50 থেকে 100 এর মধ্যে শুধুমাত্র লাইন ফিল্টার করতে চান, আপনি টাইপ পারে: :50,100!<your sed command>
।
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'