মিলে যাওয়ার লাইনের পরে কোনও ফাইলের সমস্ত লাইন আমি কীভাবে মুছব?


87

আমার কাছে একটি ফাইল রয়েছে যা বেশ কয়েকটি লাইনের পাঠ্য দ্বারা গঠিত:

The first line
The second line
The third line
The fourth line

আমার একটি স্ট্রিং রয়েছে যা লাইনগুলির মধ্যে একটি: The second line

আমি ফাইলটিতে স্ট্রিং এবং সমস্ত লাইন মুছে ফেলতে চাই, সুতরাং এটি মুছে ফেলা হবে The third lineএবং The fourth lineস্ট্রিং ছাড়াও। ফাইলটি হয়ে উঠবে:

The first line

আমি গুগলে একটি সমাধান অনুসন্ধান করেছি এবং মনে হচ্ছে আমার ব্যবহার করা উচিত sed। কিছুটা এইরকম:

sed 'linenum,$d' file

কিন্তু স্ট্রিংয়ের লাইন নম্বরটি কীভাবে সন্ধান করবেন? বা, আমি কীভাবে এটি করব?


4
আপনার সমস্যার বিবৃতিটি পরস্পরবিরোধী: 'আমি লাইনের পরে সমস্ত লাইন মুছতে চাই ' এর অর্থ আপনি মাত্র দুটি লাইন মুছে ফেলুন (আপনি যেমন বলছেন) তবে তারপরে আপনার উদাহরণ আউটপুটটি ম্যাচ লাইনটি অনুপস্থিত হিসাবে দেখায়। আপনি আসলে কি চান?
জোনাথন লেফলার

ম্যাচিং লাইন এবং এর পরে সমস্ত লাইন। আমার ইংরেজি উন্নত করা উচিত। আপনার তথ্যের জন্য ধন্যবাদ.
ডকউইকি


আমি যে লাইনটি সন্ধান করতে চাইছি তা যদি মুছতে না চাই, তবে কীভাবে এটি তৈরি করব?
byhuang1998

উত্তর:


139

আপনি যদি মিলে যাওয়া লাইনটি (বা নিম্নলিখিত কোনও লাইন) মুদ্রণ করতে না চান:

sed -n '/The second line/q;p' inputfile

এটি বলছে "যখন আপনি সেই প্যাটার্নটি পৌঁছান যা প্যাটার্নটি ছেড়ে দেওয়ার সাথে মেলে, অন্যথায় প্রতিটি লাইন মুদ্রণ করুন"। -nবিকল্প অন্তর্নিহিত মুদ্রণ বাধা দেয় এবং pকমান্ড স্পষ্টভাবে লাইন প্রিন্ট করতে প্রয়োজন হয়।

বা

sed '/The second line/,$d' inputfile

এটি বলছে "ম্যাচ করা লাইনে শুরু হয়ে ফাইলের শেষ অবধি অবিরত থেকে সমস্ত লাইন মুছুন"।

তবে প্রথমটি দ্রুত is তবে এটি সম্পূর্ণরূপে প্রক্রিয়াকরণ বন্ধ করবে যদি আপনার কাছে যুক্তি হিসাবে একাধিক ফাইল থাকে তবে প্রথম ম্যাচের ফাইলের পরে ফাইলগুলি প্রক্রিয়া করা হবে না। এই ক্ষেত্রে, মোছার ফর্মটি আরও ভাল।

আপনি যদি মিলে যাওয়া লাইনটি মুদ্রণ করতে চান তবে তবে নীচের কোনও লাইন নয়:

sed '/The second line/q' inputfile

এটি বলছে "সমস্ত লাইন মুদ্রণ করুন এবং মিলিত রেখাটি পৌঁছে গেলে প্রস্থান করুন" ( -nবিকল্প (অন্তর্ভুক্ত মুদ্রণটি ব্যবহার করা হয় না))।

অতিরিক্ত তথ্যের জন্য ম্যান সেড দেখুন ।


4
তবে কিছু কমান্ড ভাঙা পাইপ ( co -pউদাহরণস্বরূপ আরসিএস ) সম্পর্কে অ্যান্টসি পায় এবং তারপরে আপনি sed '/The second line/,$d'স্বরলিপিটি দিয়ে ভাল হন ।
জোনাথন লেফলার

আপনি দয়া করে ব্যাখ্যা যুক্ত করতে পারেন?
আহমদ আবদেলঘানি

@ আহমাদআবেদলঘানি: ব্যাখ্যা যুক্ত হয়েছে।
ডেনিস উইলিয়ামসন

@ ডেনিস উইলিয়ামসন আপনাকে অনেক ধন্যবাদ।
আহমদ আবদলঘনি

প্রথম পদ্ধতিটি মিলিত লাইনের আগে শেষবারে দু'বার মুদ্রণ করে। কাজ pপরে মুছে ফেলা হচ্ছে ;
ক্রেজিফ্রোগ

28

এটি অন্যান্য প্রদত্ত সমাধানগুলির চেয়ে কিছুটা খাটো। মূলধন কিউ ব্যবহার বন্ধ করুন বর্তমান লাইনটি মুদ্রণ করা এড়িয়ে চলে।

 sed '/The second line/Q' file

আসলে লাইনগুলি মুছতে আপনি একই বাক্য গঠন ব্যবহার করতে পারেন।

 sed -i '/The second line/Q' file

4
এটি এখন পর্যন্ত আমার প্রিয় সমাধান।
ট্রাইট্রিআগেইন

5
sed '/The second line/q0' file

অথবা, গনু সেড ছাড়াই:

sed '/The second line/q' file

বা, গ্রেপ ব্যবহার করে:

grep -B 9999999 "The second line"

অনেক ধন্যবাদ! আপনি কি আমাকে বলতে পারেন যে আমি কীভাবে একটি নির্দিষ্ট স্ট্রিংয়ের লাইন নম্বর পেতে পারি, যা আমি এখনও জানি না।
ডকউইকি

grep -n "দ্বিতীয় লাইন" ফাইল | awk -F: '{মুদ্রণ $ 1
এরিক

@ ডকুইকি: আপনার লাইন নম্বর লাগবে না; আপনি এটি অনুসন্ধান করুন। sed "/$string/,\$d" inputfile
জোনাথন লেফলার

5

খালি ব্যবহার করা (মিলিত রেখাটি দেখানো হচ্ছে না)

awk '/pattern/ {exit} {print}' file.txt

এটি সেরা উত্তর, যেহেতু আপনি দ্বিতীয় লাইনের মান জানেন না।
রনজহান

0

প্রথমে লাইন নম্বর যুক্ত করুন এবং লাইনটি মুছুন

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

awk ব্যবহার করে

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.