আমি একটি ফাইল থেকে এক বা একাধিক নির্দিষ্ট লাইন নম্বর মুছতে চাই। আমি এই উপকার ব্যবহার করে কিভাবে করব?
আমি একটি ফাইল থেকে এক বা একাধিক নির্দিষ্ট লাইন নম্বর মুছতে চাই। আমি এই উপকার ব্যবহার করে কিভাবে করব?
উত্তর:
আপনি যদি 5 এবং 10 এবং 12 এর মধ্যে লাইনগুলি মুছতে চান:
sed -e '5,10d;12d' file
এটি ফলাফলগুলি স্ক্রিনে মুদ্রণ করবে। আপনি যদি একই ফাইলে ফলাফলগুলি সংরক্ষণ করতে চান:
sed -i.bak -e '5,10d;12d' file
এটি ফাইলটিকে ব্যাক আপ করবে file.bak
এবং প্রদত্ত লাইনগুলি মুছে ।
দ্রষ্টব্য: লাইন সংখ্যা 1 থেকে শুরু হয় ফাইলটির প্রথম লাইনটি 0 নয়, 1 হয়।
sed -e '5,$d' file
sed -e '5d' file
। বাক্য গঠনটি হ'ল <address><command>
; যেখানে <address>
হয় একক লাইন 5
বা লাইনের মতো একটি রেঞ্জ 5,10
, এবং কমান্ড d
প্রদত্ত রেখা বা লাইনগুলি মুছে দেয়। ঠিকানাগুলি নিয়মিত এক্সপ্রেশন বা $
ফাইলের শেষ লাইনটি নির্দেশ করে ডলার সাইনও হতে পারে ।
আপনি কোনও নির্দিষ্ট একক লাইন দ্বারা এর লাইন নম্বরটি মুছতে পারেন
sed -i '33d' file
এটি 33 লাইন নম্বরটিতে লাইনটি মুছে ফেলবে এবং আপডেট হওয়া ফাইলটি সংরক্ষণ করবে।
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
। ধন্যবাদ!
এবং অজানা
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
এটি প্রায়শই একটি অ্যান্টিপ্যাটার্নের লক্ষণ। যে সরঞ্জামটি লাইন নম্বরগুলি তৈরি করেছে সেগুলি সেই মুহুর্তে লাইনগুলি মুছে ফেলার সাথে ভালভাবে প্রতিস্থাপন করা যেতে পারে। উদাহরণ স্বরূপ;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
( deletelines
আপনি যে ইউটিলিটিটি আপনার কল্পনা করছেন যেটি আপনার প্রয়োজন হবে) একই রকম
grep -v error logfile
এই কথাটি বলার পরে, আপনি যদি এমন পরিস্থিতিতে থাকেন যেখানে আপনার সত্যিকার অর্থে এই কাজটি সম্পাদন করা প্রয়োজন, আপনি sed
লাইন সংখ্যার ফাইল থেকে একটি সাধারণ স্ক্রিপ্ট তৈরি করতে পারেন । হাস্যকরভাবে (তবে সম্ভবত কিছুটা বিভ্রান্তিকরভাবে) আপনি এটি দিয়ে এটি করতে পারেন sed
।
sed 's%$%d%' linenumbers
এটি লাইন সংখ্যার একটি ফাইল গ্রহণ করে, প্রতি লাইন একটি করে এবং স্ট্যান্ডার্ড d
আউটপুটগুলিতে প্রতিটির পরে সংযুক্ত একই লাইন নম্বর উত্পাদন করে। এটি একটি বৈধ sed
স্ক্রিপ্ট, যা আমরা কোনও ফাইলে বা কিছু প্ল্যাটফর্মে পাইপ সংরক্ষণ করতে পারি sed
:
sed 's%$%d%' linenumbers | sed -f - logfile
কিছু প্ল্যাটফর্মে, স্ট্যান্ডার্ড ইনপুট sed -f
বোঝার বিকল্প যুক্তিটি বোঝে না -
, সুতরাং আপনাকে স্ক্রিপ্টটি একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করতে হবে, এবং আপনার কাজ শেষ হয়ে গেলে এটি পরিষ্কার করতে হবে, বা সম্ভবত লোন ড্যাশটি এর সাথে প্রতিস্থাপন করতে হবে /dev/stdin
বা/proc/$pid/fd/1
আপনার OS (অথবা শেল যদি ) আছে।
সর্বদা হিসাবে, আপনি স্ট্যান্ডার্ড আউটপুটে ফলাফল উত্পাদন না করে পরিবর্তে লক্ষ্য ফাইলটি সম্পাদনা করার বিকল্পের -i
আগে যোগ করতে পারেন । * বিএসডিশ প্ল্যাটফর্মগুলিতে (ওএসএক্স সহ) আপনারও স্পষ্ট যুক্তি সরবরাহ করতে হবে ; একটি সাধারণ প্রথা হ'ল একটি খালি যুক্তি সরবরাহ করা; ।-f
sed
-i
-i ''
p
করুন (এটি ছাড়া কাজ করবে না এবং কোনও কাজ করবে না)। d
-n
-n
!d
আমি awk সহ একটি সাধারণীকরণের প্রস্তাব দিতে চাই।
ফাইলটি যখন একটি নির্দিষ্ট আকারের ব্লকগুলি দ্বারা তৈরি করা হয় এবং প্রতিটি ব্লকের জন্য মুছে ফেলার লাইনগুলি পুনরাবৃত্তি করা হয়, তখন অ্যাডাব্লিক এমনভাবে সূক্ষ্মভাবে কাজ করতে পারে
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
এই উদাহরণে ব্লকের আকারটি 2000 এবং আমি লাইনগুলি [1..713] এবং [1026..1029] মুদ্রণ করতে চাই।
NR
বর্তমান লাইন নম্বরটি সংরক্ষণ করতে অ্যাওকে দ্বারা ব্যবহৃত চলক।%
দুটি পূর্ণসংখ্যার ভাগের অবশিষ্ট (বা মডুলাস) দেয়;nl=((NR-1)%BLOCKSIZE)+1
এখানে আমরা পরিবর্তনশীল লিখতে nl এর বর্তমান ব্লক ভিতরে লাইন সংখ্যা। (নিচে দেখ)||
এবং &&
লজিক্যাল অপারেটর হয় বা এবং এবং ।print $0
সম্পূর্ণ লাইন লিখেছেনWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+