সেড ব্যবহার করে কোনও পাঠ্য ফাইল থেকে নির্দিষ্ট লাইন নম্বর (গুলি) মুছবেন?


235

আমি একটি ফাইল থেকে এক বা একাধিক নির্দিষ্ট লাইন নম্বর মুছতে চাই। আমি এই উপকার ব্যবহার করে কিভাবে করব?


1
আপনি যা চান তার আরও নির্দিষ্ট উদাহরণ দিতে পারেন? কোন লাইন অপসারণ করবেন তা আপনি কীভাবে সিদ্ধান্ত নেবেন?
মার্ক বাইয়ার্স

হয়তো আরও দেখুন stackoverflow.com/questions/13272717/... এবং (চাবি এসসিয়েতিভ আরে নেই মুদ্রণ) শুধু বিপরীত applyeit।
ট্রিপলি

উত্তর:


374

আপনি যদি 5 এবং 10 এবং 12 এর মধ্যে লাইনগুলি মুছতে চান:

sed -e '5,10d;12d' file

এটি ফলাফলগুলি স্ক্রিনে মুদ্রণ করবে। আপনি যদি একই ফাইলে ফলাফলগুলি সংরক্ষণ করতে চান:

sed -i.bak -e '5,10d;12d' file

এটি ফাইলটিকে ব্যাক আপ করবে file.bak এবং প্রদত্ত লাইনগুলি মুছে ।

দ্রষ্টব্য: লাইন সংখ্যা 1 থেকে শুরু হয় ফাইলটির প্রথম লাইনটি 0 নয়, 1 হয়।


32
সমস্ত ইউনিক্সের "-i" দিয়ে gnu শেড নেই। "সেড সেমিডি ফাইল> ফাইল" এ ফিরে যাওয়ার ভুল করবেন না, যা আপনার ফাইলটি মুছে ফেলবে।
Pra

4
আমি যদি শেষ লাইনের 5 তম লাইনটি মুছতে চাইতাম?
জর্জেন পল

14
@ ওয়ারেথ ওয়ার্ল্ডsed -e '5,$d' file
ব্রায়ান ক্যাম্পবেল

1
@ ব্রায়ান ক্যাম্পবেল কেবলমাত্র একটি নির্দিষ্ট লাইন মুছে ফেলতে আমার কী করা উচিত ??
কানগাভেলু সুগুমার

14
@KanagaveluSugumar sed -e '5d' file। বাক্য গঠনটি হ'ল <address><command>; যেখানে <address>হয় একক লাইন 5বা লাইনের মতো একটি রেঞ্জ 5,10, এবং কমান্ড dপ্রদত্ত রেখা বা লাইনগুলি মুছে দেয়। ঠিকানাগুলি নিয়মিত এক্সপ্রেশন বা $ফাইলের শেষ লাইনটি নির্দেশ করে ডলার সাইনও হতে পারে ।
ব্রায়ান ক্যাম্পবেল

50

আপনি কোনও নির্দিষ্ট একক লাইন দ্বারা এর লাইন নম্বরটি মুছতে পারেন

sed -i '33d' file

এটি 33 লাইন নম্বরটিতে লাইনটি মুছে ফেলবে এবং আপডেট হওয়া ফাইলটি সংরক্ষণ করবে।


1
আমার ক্ষেত্রে "সেড" একটি ভুল লাইন সরিয়েছে। তাই আমি এই পদ্ধতির ব্যবহার করুন: sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'। ধন্যবাদ!
এডুয়ার্ডো লুসিও

এখানে একইভাবে, আমি একটি লুপ লিখেছিলাম এবং আশ্চর্যের সাথে কিছু ফাইল সঠিক লাইনটি হারিয়েছে তবে কিছু ফাইল অন্য একটি লাইনও হারিয়েছে, কী ভুল হয়েছে তার কোনও ক্লু নেই। (জিএনইউ / লিনাক্স bash4.2) নীচে awk কমান্ডটি লুপটিতে দুর্দান্ত কাজ করেছে
ফাতিহসারিগল

আপনি যদি রেখার তালিকা থেকে মুছে ফেলতে চান তবে সর্ট-আরআর ব্যবহার করতে সত্যিই সতর্ক থাকুন, অন্যথায় আপনার প্রথম
সেড

একটি লুপের মধ্যে ভুল রেখাগুলি মুছে ফেলা সম্পর্কে মন্তব্য করতে: বৃহত্তম লাইন নম্বর দিয়ে শুরু করবেন তা নিশ্চিত হন, নইলে প্রতিটি মুছে ফেলা লাইন নম্বরটি অফসেট করে ...
স্কিপি লে গ্র্যান্ড গৌরূ

25

এবং অজানা

awk 'NR!~/^(5|10|25)$/' file

2
এনবি: সেই বিস্ময়কর লাইনটি আমার জন্য সেড ভেরিয়েন্টের চেয়ে বেশি নির্ভরযোগ্যভাবে কাজ করেছে (ওএস-এক্স এবং উবুন্টু লিনাক্সের মধ্যে)
জে টেলর

3
নোট করুন যে এটি ফাইলের কিছু মুছবে না। এটি এই স্ট্যান্ডআউটে এই লাইনগুলি ছাড়া ফাইলটি মুদ্রণ করে। সুতরাং আপনাকে আউটপুটটি কোনও টেম্প ফাইলে পুনর্নির্দেশ করতে হবে এবং তারপরে মূলটি প্রতিস্থাপন করতে টেম্প ফাইলটি সরিয়ে নিতে হবে।
mivk


6

এটি প্রায়শই একটি অ্যান্টিপ্যাটার্নের লক্ষণ। যে সরঞ্জামটি লাইন নম্বরগুলি তৈরি করেছে সেগুলি সেই মুহুর্তে লাইনগুলি মুছে ফেলার সাথে ভালভাবে প্রতিস্থাপন করা যেতে পারে। উদাহরণ স্বরূপ;

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আগে যোগ করতে পারেন । * বিএসডিশ প্ল্যাটফর্মগুলিতে (ওএসএক্স সহ) আপনারও স্পষ্ট যুক্তি সরবরাহ করতে হবে ; একটি সাধারণ প্রথা হ'ল একটি খালি যুক্তি সরবরাহ করা; ।-fsed-i-i ''


আমি "অ্যান্টিপ্যাটার্নের লক্ষণ" এর সাথে একমত হই না। মার্কআপ-ভিত্তিক ফাইলের ধরণের (যেমন এক্সএমএল বা জেএসএন) বৈধ ফাইল হওয়ার জন্য শেষে নির্দিষ্ট লাইনগুলির প্রয়োজন require সেক্ষেত্রে প্রায়শই সেই লাইনগুলি সরিয়ে ফেলার জন্য সবচেয়ে যুক্তিসঙ্গত পন্থা, আপনি যা যুক্ত করতে চান তা ফাইলে রাখুন এবং সেই লাইনগুলি আবার যুক্ত করুন, কারণ সরাসরি লাইনগুলি সরাসরি রেখে দেওয়াই আরও বেশি প্রচেষ্টা হতে পারে এবং এর বিরুদ্ধে চলে যায় আপনার যতটা সম্ভব সেডের মতো অতিরিক্ত সরঞ্জাম এড়াতে সম্ভাবনা তৈরি করা।
ডিম হান্স

আপনি কোন ধরণের দৃশ্যের কল্পনা করছেন তা আমি পুরোপুরি বুঝতে পারি না। সেখানে হয় পরিস্থিতিতে যেখানে এই একটি বৈধ পদ্ধতির কিন্তু মামলা আমি দেখেছি বেশীরভাগ হয় নতুনদের যারা বেশী বা কম ঠিক কি আমার প্রথম উদাহরণ প্রমান না করা হয়। (সম্ভবত এগুলি কিছু উচ্চ স্তরের ভাষা থেকে এসেছে এবং তাদের সমস্যাটি আণবিক স্তরের অতীতকে বিভক্ত করার জন্য
অভ্যস্ত

এক্সএমএল বা জেএসএন থেকে লাইন নম্বর দ্বারা স্টাফ সরিয়ে নেওয়া বাহ্যিকভাবে ভঙ্গুর শোনায় , যদি তা একেবারেই বিপজ্জনক না হয়।
ট্রিপলি

মূলত এর দ্বারা আমি যা বোঝাতে চাইছি তা হ'ল এই জাতীয় ফাইলের নির্মাতা হিসাবে আপনি কীভাবে নথিটির শেষে থাকতে হবে তা বোঝেন (অর্থাত্ জেএসএনের জন্য শেষ কয়েকটি লাইনে বন্ধনী বন্ধনী / বর্গাকার বন্ধনীগুলির সেট বা সঠিক) এক্সএমএলের জন্য ক্লোজিং ট্যাগ)। এ সম্পর্কে সচেতন থাকাকালীন, এই জাতীয় দলিলটি প্রসারিত করার জন্য সবচেয়ে সহজ পদ্ধতি হ'ল 1) শেষ কয়েকটি লাইন সরিয়ে ফেলুন, 2) নতুন সামগ্রী যুক্ত করুন, 3) শেষ কয়েকটি লাইনে পুনরায় যুক্ত করুন। এইভাবে, দস্তাবেজটি প্রসারিত হওয়ার আগে এবং পরে উভয়ই বৈধ হতে পারে, মিড-ডকুমেন্টের লাইন যুক্ত করার কোনও উপায় অনুসন্ধান করার প্রয়োজন ছাড়াই।
ডিম হ্যানস

1
এখন পর্যন্ত এটি একটি বৃহত সংখ্যক লাইনের (যেমন কোনও ফাইল দ্বারা সরবরাহিত) উপযুক্ত সমাধান সহ একমাত্র উত্তর is এবং পূর্বনির্দেশটিও বোধগম্য হয়। এটি আরও উন্নয়নের দাবিদার। বিটিডাব্লু, আপনি যদি মুছে ফেলার পরিবর্তে লাইনগুলি মুদ্রণ করতে চান তবে বিকল্পের পাশাপাশি ব্যবহার pকরুন (এটি ছাড়া কাজ করবে না এবং কোনও কাজ করবে না)। d-n-n!d
স্কিপি লে গ্র্যান্ড গৌরূ

2

আমি 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      |
+-----+------+----------+------------+


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