শেড ব্যবহার করে খালি লাইনগুলি মুছুন


349

আমি সেড ব্যবহার করে খালি লাইনগুলি মুছে ফেলার চেষ্টা করছি:

sed '/^$/d'

তবে এর সাথে আমার ভাগ্য নেই।

উদাহরণস্বরূপ, আমার এই লাইনগুলি রয়েছে:

xxxxxx


yyyyyy


zzzzzz

এবং আমি এটির মতো হতে চাই:

xxxxxx
yyyyyy
zzzzzz

এর জন্য কোডটি কী হওয়া উচিত?


2
আপনার
সিড

উপরের কমান্ডটি আপনার কাছে কোনও স্থান / ট্যাব না থাকলেও সিআর + এলএফ লাইনের সমাপ্তি কাজ করবে না ।
ডেভনুল

উত্তর:


626

আপনার "খালি" লাইনে আপনার ফাঁকা জায়গা বা ট্যাব থাকতে পারে। ব্যবহারের POSIX শ্রেণীর সঙ্গে sedকেবল সাদা ব্যবধান ধারণকারী সব লাইন মুছে ফেলার জন্য:

sed '/^[[:space:]]*$/d'

একটি সংক্ষিপ্ত সংস্করণ যা পূর্ব ব্যবহার করে, উদাহরণস্বরূপ গনু সেড সহ:

sed -r '/^\s*$/d'

(দ্রষ্টব্য যে সেড পিসিআরই সমর্থন করে না ))


3
পছন্দ করেছেন এটি এর আগে-r
কেন্ট

8
ওএস এক্সের প্রয়োজন sed -i "" '/^[[:space:]]*$/d' <filename>,
jwww

@ বার্নিরিটার ^\s*$সমস্ত "খালি" রেখাগুলির সাথে মিলবে, এখানে খালি মানে, লাইনে কোনও অক্ষর নেই, বা লাইনে কেবল খালি স্ট্রিং রয়েছে (উদাহরণস্বরূপ স্পেস)। dকমান্ডের সাহায্যে সমস্ত মিলিত লাইনগুলি সেড দ্বারা সরানো হবে ।
ক্যান্ট

96

আমি awkসমাধানটি মিস করছি :

awk 'NF' file

যা ফিরে আসবে:

xxxxxx
yyyyyy
zzzzzz

কিভাবে কাজ করে? যেহেতু NF"ক্ষেত্রের সংখ্যা" এর অর্থ দাঁড়ায়, সেই রেখাগুলি খালি থাকায় 0 টি ফাইডল থাকে, যাতে জনসমাফিক 0 থেকে মিথ্যা পর্যন্ত মূল্যায়ন করে এবং কোনও লাইন মুদ্রিত হয় না; তবে, যদি কমপক্ষে একটি ক্ষেত্র থাকে তবে মূল্যায়নটি সত্য এবং awkএর ডিফল্ট ক্রিয়া সম্পাদন করে: বর্তমান লাইনটি মুদ্রণ করুন।


1
Whoah। এমনকি বিএসডি-র "মিনিমাইজড" সংস্করণটির সাথে সংঘটিত হয় (সংস্করণ 20121220 (ফ্রিবিএসডি) Thanksধন্যবাদ :-)
বার্নি রিটার

@ বার্নিরিটার আপনাকে স্বাগত জানিয়েছে :) হ্যাঁ, এটি একটি খুব বেসিক আইডেম্যাটিক জিনিস যা সমস্ত বিস্মৃত সংস্করণ অনুমোদন করে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

এবং এটি এত তাড়াতাড়ি যদিও - একটি দ্রুত এবং নোংরা পরীক্ষার জন্য - আমি দু'বার বোকা ডাকছি: $ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s এটিকে কোনও উদ্রেক স্ক্রিপ্টের মধ্যে যেমন অন্তর্নিহিত করার কোনও নিফটি উপায় সম্পর্কে আপনি কি জানেন? awk '/ মাইপাটার / stuff কর স্টাফ ... B'
বার্নি

@ বার্নিরিটার আপনি বলতে পারেন awk 'NF {do stuff...}'
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1
দ্রষ্টব্য যে এটি কেবল শ্বেতস্পেসের সাথে রেখাগুলি উপেক্ষা করবে।
উইসবুকি

60

sed '/^$/d'ভাল থাকতে হবে, আপনি কি জায়গায় জায়গায় ফাইলটি পরিবর্তন করার আশা করছেন? যদি তাই হয় তবে আপনার -iপতাকাটি ব্যবহার করা উচিত ।

হতে পারে সেই লাইনগুলি খালি নয়, সুতরাং যদি এটি হয় তবে এই প্রশ্নটি দেখুন টেক্সটফাইলগুলি থেকে খালি লাইনগুলি সরিয়ে ফেলুন, লাইনের শুরু এবং শেষের দিক থেকে ফাঁকা স্থান সরিয়ে ফেলুন আমি বিশ্বাস করি আপনি এটি অর্জন করার চেষ্টা করছেন।


হ্যাঁ. আমি একটি ফাইল পরিবর্তন করছি * .csv। -i কীভাবে সেড কমান্ডে রাখা উচিত?
জোনাস

2
sed -i '/^$/d'এটি করার একটি উপায়।
আলবার্তো জ্যাকগাগনি

49

1
এগুলি আপনার অনলাইন সরঞ্জাম সঠিকভাবে দেখা, কিন্তু []উচিত না , একটি বন্ধনী এক্সপ্রেশনে পলান করা যাতে কোড এখানে সঠিক নয় \[\[:space:\]\]বা \[ \t\]- হওয়া উচিত [[:space:]]এবং [ \t]
বেনিয়ামিন ডব্লিউ।

1
@BenjaminW। এটি ধরার জন্য ধন্যবাদ এগুলি মূল লেখকের কাছ থেকে নয়, 3 এডিট থেকে এসেছিল যখন এটি নিয়মিত পাঠ্য থেকে "কোড" এ পরিবর্তিত হয়েছিল, যা পরে "ing \।" পলায়নের "প্রকাশ" করে দেয়। আমি এখন সেগুলি স্থির করেছি।
উইসবাকি

30

আমি বিশ্বাস করি এটি সবচেয়ে সহজ এবং দ্রুততম:

cat file.txt | grep .

আপনার যদি সমস্ত সাদা-স্পেস লাইনের পাশাপাশি উপেক্ষা করার প্রয়োজন হয় তবে এটি চেষ্টা করুন:

cat file.txt | grep '\S'

উদাহরণ:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

আউটপুট

7
5

5
প্রয়োজন নেই cat, grepপাশাপাশি ফাইলগুলিও নেয়:grep . file.txt
সিরো সান্তিলি 法轮功 冠状 病 六四 六四 事件

3
হ্যাঁ, আমি জানি, তবে প্রাথমিক প্রশ্নটি উত্স ফাইল বা অন্য কিছু কিনা তা উল্লেখ করেনি, সুতরাং সমাধানটি "|" এর পরে আসে এবং এটির আগে কেবল উত্সের উদাহরণ। কেবল সমাধানগুলি লাইনের উত্স থেকে পৃথক করা।
ভাদিম

2
grep '\S'অবশ্যই পোর্টেবল নয়। আপনার যদি থাকে grep -Pতবে আপনি এটি ব্যবহার করতে পারেন grep -P '\S'তবে এটি সমস্ত প্ল্যাটফর্মগুলিতে সমর্থিত নয়।
ট্রিপলি

grep .অন্যান্য সমাধানগুলির সাথে তুলনার নেতিবাচক দিকটি হ'ল এটি সমস্ত লেখাকে লাল রঙে হাইলাইট করবে। অন্যান্য সমাধানগুলি মূল রঙগুলি সংরক্ষণ করতে পারে। তুলনা unbuffer apt search foo | grep .করুনunbuffer apt search foo | grep -v ^$
উইসবুকি

15

এখানে গৃহীত উত্তর এবং উপরে গৃহীত উত্তরগুলির সাহায্যে আমি ব্যবহার করেছি:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

এটি সমস্ত ঘাঁটিগুলি কভার করে এবং আমার প্রয়োজনের জন্য নিখুঁতভাবে কাজ করে। মূল পোস্টারগুলিতে কুতোস @ কেন্ট এবং @ কেভ



2

আপনি "গ্রেপ" ব্যবহার করে এমন কিছু করতে পারেন:

egrep -v "^$" file.txt


2

আপনি সম্ভবত অপ্রত্যাশিত আচরণটি দেখছেন কারণ আপনার পাঠ্য ফাইলটি উইন্ডোজে তৈরি হয়েছিল, সুতরাং লাইন ক্রমের শেষ \r\n। চালা বা চালানোর আগে আপনি ইউনিক্স স্টাইলের টেক্সট ফাইলে রূপান্তর করতে ডস 2 ইউনিক্স ব্যবহার করতে পারেন

sed -r "/^\r?$/d"

গাড়ি চালানো আছে কিনা তা ফাঁকা লাইনগুলি সরাতে।


হাই, -rপতাকা কী করছে এবং -iফাইলটি সরাসরি সংশোধন করতে এবং স্ক্রিনে মুদ্রণ এড়াতে এটির সাথে একত্রিত করা সম্ভব ? sed -r "/^\r$/d"
তদতিরিক্ত

2

আরেকটি বিকল্প ছাড়া sed, awk, perl, ইত্যাদি

strings $file > $output

স্ট্রিংস - ফাইলগুলিতে মুদ্রণযোগ্য অক্ষরের স্ট্রিং মুদ্রণ করুন।


আপনি কি এর stringsপরিবর্তে মানে string?
মিকেল বি।

হাই @ মিকেলবি আপনি ঠিক বলেছেন, আমি এটি ঠিক করেছি।
user319660

0

আমার-নির্দিষ্ট bashউত্তরটি হ'ল এর জন্য perlবিশ্বব্যাপী প্যাটার্ন gপতাকা সহ সাবস্টিটিউশন অপারেটরটি ব্যবহার করার পরামর্শ দেওয়া হল :

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

এই উত্তরটি খালি রেখাগুলিতে তাদের ( [\ ]*) ফাঁকা স্থান রয়েছে কিনা তা হিসাবরক্ষণের পাশাপাশি |একাধিক অনুসন্ধানের পদ / ক্ষেত্রগুলি পৃথক করতে ব্যবহার করে । ম্যাকোস হাই সিয়েরা এবং সেন্টস 6/7-তে পরীক্ষিত।

অবগতির জন্য, ওপি মূল কোড sed '/^$/d' $fileমাত্র কাজ করে জরিমানা bashএকটি উচ্চ ক্ষমতা সম্পন্ন সুপারকম্পিউটিং ক্লাস্টার এ MacOS উচ্চ সিয়েরা এবং সেন্টওএস 6/7 লিনাক্স টার্মিনাল।


-3

আমার জন্য FreeBSD 'র 10.1 সঙ্গে sed কাজ শুধুমাত্র এই সমাধান:

sed -e '/^[     ]*$/d' "testfile"

ভিতরে []স্পেস এবং ট্যাব চিহ্ন রয়েছে।

পরীক্ষার ফাইলটিতে রয়েছে:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

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