একটি ফাইল থেকে একটি # দিয়ে শুরু করে সমস্ত লাইন মুছুন


182

কোনও ফাইলের মন্তব্যে সমস্ত লাইনই শুরু হয় #। যে সমস্ত লাইন দিয়ে শুরু হয় (এবং কেবলমাত্র সেই লাইনগুলি) আমি কীভাবে মুছতে পারি #? অন্যান্য লাইনগুলি সমেত #, তবে লাইনের শুরুতে এড়ানো উচিত নয়।


1
#blah \<nl>blahব্যাকস্ল্যাশটি নতুন লাইনটি ছাপিয়ে যাওয়ার কারণে কি এই সাধারণ কনভেনশনটির সাথে কাজ করতে হবে যা একটি একক "লজিকাল লাইন" হিসাবে গণ্য হবে?
sarnold

@ সার্নোল্ড: এর বাইরে makeকোন ইউটিলিটিগুলি 'মন্তব্য শেষ করার আগে' ব্যাকস্ল্যাশ স্প্লাইসিস লাইনগুলি ব্যবহার করে? শেলগুলি (বাশ এবং কেএসএস পরীক্ষিত) তা করে না। সি এবং সি ++ প্রিপ্রোসেসর নির্দেশিকাগুলির অন্য প্রক্রিয়াজাতকরণের আগে নতুন লাইনের বিভক্তিকে পরিচালনা করে তবে তারা মন্তব্যগুলির পরিবর্তে নির্দেশিকা।
জোনাথন লেফলার

@ জোনাথন: দুর্দান্ত আমি ধরে নিয়েছিলাম যে সাধারণ \<nl>পালানোও মন্তব্যগুলিতে কাজ করবে। তবে বাহ আমি ভুল ছিলাম। আমি এখনও অন্য একটি উদাহরণ খুঁজে পাইনি ... :) ধন্যবাদ!
2:30 এ sarnold

উত্তর:


301

এটি একটি সেড ওয়ান-লাইনারের সাহায্যে করা যেতে পারে :

sed '/^#/d'

এটি বলছে, "সমস্ত # টি দিয়ে শুরু করে # টি দিয়ে শুরু করুন এবং এগুলি মুছুন, সমস্ত কিছু ছেড়ে দিন।"


9
সংক্ষিপ্ত সংস্করণ:sed /^#/d
কেভ

80
আমার মতো লিনাক্স নুবসের জন্য:sed '/^#/ d' < inputFile.txt > outputFile.txt
নিল ম্যাকগুইগান

49
সংক্ষিপ্ততম সংস্করণ: sed -i '/^#/d' filepath
লেডেরিড

14

1
@ ভাইস্টাররা এটি চেষ্টা করুন:awk '/^#/ && !first { first=1 ; next } { print $0}'
রেমন্ড

56

আমি একটু অবাক হয়েছি কেউই এর সবচেয়ে সুস্পষ্ট সমাধানের পরামর্শ দেয়নি:

grep -v '^#' filename

যেমনটি বলা হয়েছে সমস্যাটি সমাধান করে।

তবে মনে রাখবেন যে একটি সাধারণ সম্মেলনটি #একটি লাইনের শেষ থেকে শেষের প্রতিটি কিছুর জন্য মন্তব্য হিসাবে বিবেচিত হবে:

sed 's/#.*$//' filename

যদিও সেই আচরণ করে, উদাহরণস্বরূপ, একটি #স্ট্রিংয়ের মধ্যে একটি অক্ষর একটি মন্তব্যের শুরু হিসাবে (যা আপনার ক্ষেত্রে প্রাসঙ্গিক হতে পারে বা নাও পারে) (এবং এটি খালি লাইন ছেড়ে যায়)।

স্বেচ্ছাসেবী থেকে শুরু হওয়া স্বতঃস্ফূর্তের সাথে শুরু হওয়া একটি লাইনও #একটি মন্তব্য হিসাবে বিবেচিত হবে:

grep -v '^ *#' filename

যদি সাদা স্থানটি কেবলমাত্র ফাঁকা স্থান হয়, বা

grep -v '^[  ]#' filename

যেখানে দুটি স্পেস আসলে একটি শূন্যস্থান যার পরে আক্ষরিক ট্যাব অক্ষর (টাইপ "কন্ট্রোল-ভি ট্যাব") থাকে।

এই সমস্ত কমান্ডের জন্য, filenameস্ট্যান্ডার্ড ইনপুট (যেমন, পাইপের অংশ হিসাবে) থেকে পড়ার আর্গুমেন্টটি বাদ দিন ।


আমি একটি নতুন উত্তর যুক্ত করেছি যা এই উত্তরটির উপর নির্ভর করে।
একিউম্যানাস

উইন্ডোজে এইভাবে গ্রেপ ব্যবহার করতে আমার সমস্যা হয়েছিল। সমাধানটি 'বাই' দ্বারা প্রতিস্থাপন করা, যেমনgrep -v "^#" filename
সের্গ

14

রেমন্ডের সমাধানের বিপরীত:

sed -n '/^#/!p'

"কিছু দিয়ে প্রিন্ট করবেন না, কেবল যে লাইনগুলি # দিয়ে শুরু করবেন না" ব্যতীত


8

আপনি সরাসরি আপনার ফাইল সম্পাদনা করতে পারেন

sed -i '/^#/ d'

আপনি চাইলে এমন মন্তব্য লাইনগুলিও মুছুন যা কিছু শ্বেতস্পেস ব্যবহারের সাথে শুরু হয়

sed -i '/^\s*#/ d'

সাধারণত, আপনি আপনার স্ক্রিপ্টের প্রথম লাইনটি রাখতে চান, যদি এটি কোনও শ-ব্যাং হয়, সুতরাং sedশুরু হওয়া লাইনগুলি মুছে ফেলা উচিত নয় #!। এছাড়াও এটি লাইনগুলি মুছে ফেলা উচিত, এতে কেবল একটি হ্যাশ রয়েছে তবে কোনও পাঠ্য নেই। সব একসাথে রাখুন:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

সমস্ত সেড ভেরিয়েন্টের সাথে সামঞ্জস্য করার জন্য আপনাকে -iবিকল্পটিতে একটি ব্যাকআপ এক্সটেনশন যুক্ত করতে হবে :

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

প্লাস 1 যার জন্য স্থান
ডিপাকসিংহ পাওয়ার

7

আপনি এডকে সমাধানের জন্য নিম্নলিখিতটি ব্যবহার করতে পারেন -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile

5

এই উত্তরটি কীথের পূর্ববর্তী উত্তরের উপর নির্ভর করে ।

egrep -v "^[[:blank:]]*#" মন্তব্য লাইন ফিল্টার আউট করা উচিত।

egrep -v "^[[:blank:]]*(#|$)" প্রায়শই দরকারী হিসাবে, উভয় মন্তব্য এবং খালি লাইন ফিল্টার করা উচিত।

[:blank:]অন্যান্য চরিত্রের ক্লাস সম্পর্কে তথ্যের জন্য https://en.wikedia.org/wiki/Regular_expression#Character_class দেখুন


আপনার egrepসমর্থন ধরে নিচ্ছে যে সিনট্যাক্স; পুরানো সংস্করণ নাও পারে।
কিথ থম্পসন

-3

কিছু এক্সটেনশান সহ সমস্ত ফাইলের লুপের সাথে এখানে:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.