5 নম্বর থেকে শুরু করে ফাঁকা লাইনগুলি কীভাবে মুছবেন


10

আমি এই আছে:

sed -i '/^$/d' temp_spec.rb

যা ফাঁকা রেখা ফেলা এবং ভাল কাজ করে। আমি কীভাবে এটি কেবলমাত্র 5-999 লাইনের জন্য করতে পারি (বা ফাইলের শেষ পর্যন্ত 5)।

আমি চেষ্টা করেছিলাম:

sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb

কিন্তু কোনটিই কাজ করে নি (কোনও ত্রুটি নেই)।


ঠিক নিশ্চিত করার জন্য: আপনি কি লাইনগুলি 1 থেকে 4 রাখতে চান , সেগুলি ফাঁকা হোক বা না হোক, বা আপনি 1 থেকে 4 লাইন মুছে ফেলতে চান , তা ফাঁকা হোক না কেন? (এখনও অবধি, আমি পূর্বেরটিকে ধরে নিয়েছি, তবে আপনি যে দ্বিতীয় আদেশটি ব্যবহার করেছিলেন তা আমাকে বিস্মিত করে))
উওউ

উত্তর:


12

আপনি যদি 5 টি লাইন দিয়ে শুরু করে সমস্ত ফাঁকা রেখা মুছতে এবং 1 থেকে 4 রেখাগুলি রাখতে চান তবে আপনি ব্যবহার করতে পারেন

sed -i '5,${;/^$/d;}' temp_spec.rb

{গোষ্ঠীবদ্ধ অপারেটর, তাই প্রথম কমান্ড 5,${মানে হলো "লাইন 5 থেকে ইনপুট শেষ না হওয়া পর্যন্ত ( $) ম্যাচিং পর্যন্ত নিম্নোক্ত কমান্ডগুলো প্রয়োগ }"। {এবং এর মধ্যে থাকা কমান্ডগুলি }আবার ঠিকানাগুলির দ্বারা উপস্থাপিত হতে পারে, সুতরাং অভ্যন্তরীণ কমান্ডটির /^$/dঅর্থ "যদি লাইনের শুরু ( ^) এবং শেষ ( $) এর মধ্যে কিছু না থাকে তবে এটি মুছুন"। শেড কমান্ডগুলি দ্বারা পৃথক করা যায় ;। (এই sed একটি খারাপভাবে নথিভুক্ত বৈশিষ্ট্য এটা sed বাস্তবায়নের দ্বারা সমর্থিত, কিন্তু এটা না। সম্পূর্ণভাবে পোর্টেবল না Hauke দ্বারা হিসাবে উল্লিখিত,।) ;পরে {ঐচ্ছিক; আগে এক }প্রয়োজন, যদিও।

আপনি যদি 5 টি লাইন দিয়ে শুরু করে সমস্ত ফাঁকা লাইন মুছে ফেলতে এবং 1 থেকে 4 লাইনগুলি মুছতে চান তবে এটি আরও সহজ:

sed -i '1,4d;/^$/d' temp_spec.rb

খুশী হলাম। আমি জানতাম না যে ঠিকানাগুলি সেভাবে বাসা বাঁধতে পারে। আমার জন্য এটি নেতৃস্থানীয় ছাড়াও কাজ ;করে।
হউক লেগেইং

হ্যাঁ, আপনি ঠিক প্রথম সম্পর্কে ;
উয়ে

@ হউক লিগিং আপনি ';' দ্বারা একটি সেড স্ক্রিপ্টে কমান্ডগুলি পৃথক করতে পারেন; পরিবর্তে এগুলি পৃথক লাইনে রাখুন। এটি একটি "অননুমোদিত" বৈশিষ্ট্য।
প্র্রেড্রাগ পুণোসেভ্যাক

4

অ্যাজক ব্যবহার করে অন্য একটি বিকল্প:

awk 'NR<5||/./'

2
sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb

সম্পাদনা 1:

আমি এই ব্যাখ্যা করার কথা, এইভাবে ...

এটি অযথা জটিল। আমি জানতাম না যে ঠিকানার ব্যাপ্তিগুলির মধ্যে অনুমতি রয়েছে {}। সুতরাং আমাকে "খালি লাইনগুলি মুছুন" আলাদাভাবে প্রকাশ করতে হয়েছিল। কোর কমান্ডটি tযা সেডের উপায় if ... thenTসহজ হত তবে কেবল জিএনইউ সেডের জন্য উপলব্ধ। আমি মানুষ পৃষ্ঠাটি উদ্ধৃত:

t লেবেল: / ইন / / বি / / / / / / / / / / / / /ীরা / তে / ল / র / - / - / - / - - - - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / - / / / / / - / / / / / / - / - / / / / / / / = / / / / = / = / = / = + = + = / = / = / = / = / + / + / + + +] + থেকে শেষের ইনপুট লাইনটি পড়ার পরে এবং শেষ টি বা টি-এর কমান্ডের পরে / লেবেল থেকে শাখা; যদি লেবেল বাদ দেওয়া হয়, স্ক্রিপ্টের শেষে শাখা।

আমি বিখ্যাত sকমান্ডকে গালি দিই । এটি কেবলমাত্র লাইনটি খালি কিনা তা পরীক্ষার পরিবর্তে কোনও কিছুই প্রতিস্থাপন করবে না। সুতরাং এটি খালি লাইন দ্বারা একটি ফাঁকা রেখা প্রতিস্থাপন করে (যে কোনওভাবেই লাইনটি মোছা হওয়ায় প্রতিস্থাপন হিসাবে কিছু ব্যবহার করতে পারে)।

যদি s"প্রতিস্থাপন" করে থাকে তবে লাইনটি ফাঁকা। সেক্ষেত্রে কমান্ড dকার্যকর করা হবে। নাহলে কিছুই করার নেই। tকোনও sক্রিয়াকলাপের ক্ষেত্রে যেমন লাফ দেয় না bস্ক্রিপ্টের শেষে যেতে আমার শাখা কমান্ডের প্রয়োজন । : labelশাখা লক্ষ্য। gotoআগের মতো অন্ধকার যুগে (যখন সেড আবিষ্কার করা হয়েছিল ... তে-হি)।

আরও একটি বিকল্প sহ'ল সমস্ত খালি খালি লাইনগুলিকে "প্রতিস্থাপন" করা, sআরও জটিল তবে কমান্ডটি আরও সহজ করে তোলে:

sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input

^..*$"" খালি খালি লাইন "এর \1অর্থ এবং " প্রথম বন্ধনীগুলির সামগ্রী "means


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