ইউনিক্সের কোনও ফাইল (ফাঁকা স্থান সহ) খালি / ফাঁকা লাইনগুলি কীভাবে সরিয়ে ফেলবেন?


60

কমান্ড লাইনটি ব্যবহার করে আমি কীভাবে ইউনিক্স / লিনাক্সের কোনও ফাইলের ফাঁকা / ফাঁকা (কেবলমাত্র ফাঁকা স্থানগুলি) সরিয়ে ফেলব?

file.txt এর বিষয়বস্তু

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

আউটপুট পছন্দসই

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
এটি একটি মহাকাব্য উত্তর যে প্রায় কাছাকাছি, grep, কিন্তু, awk ব্যবহার প্রত্যেক সম্ভাব্য সমাধান দেয়: stackoverflow.com/questions/16414410/...
— wisbucky

উত্তর:


86

এই সেড লাইনের কৌশলটি করা উচিত:

sed -i '/^$/d' file.txt

এর -iঅর্থ স্থানটিতে ফাইলটি সম্পাদনা করবে।


13
কেবল ফাঁকা স্থান রয়েছে এমন লাইনগুলি সরাতে এটি "/ ^ * $ / d" আসলে প্রয়োজন be
— শান রিফশনিডার

2
এই উত্তরটি যখন লেখা হয়েছিল তখন প্রশ্নটি ছিল না?
— কাস্পার্ড

4
@ সানরাইফশনিডার কি "/ ^ \ s * $ / d" এর চেয়ে বেশি ভাল হবে না কারণ এতে ট্যাবগুলি অন্তর্ভুক্ত থাকবে? যদিও এটি মূল পোস্টে উল্লেখ করা হয়নি, এটি আমার কাছে আরও শক্তিশালী বিকল্প বলে মনে হচ্ছে।
— mrswadge


আমি পেয়েছিbad flag in substitute command: 'e'
— ishandutt2007

29

grep

সাধারণ সমাধানটি নীচে হিসাবে grep( জিএনইউ বা বিএসডি ) কমান্ড ব্যবহার করে।

  • ফাঁকা লাইনগুলি সরিয়ে ফেলুন (স্পেস সহ লাইনগুলি সহ নয়)।

    grep . file.txt
    
  • সম্পূর্ণ ফাঁকা লাইনগুলি সরিয়ে ফেলুন (স্পেস সহ লাইনগুলি সহ)।

    grep "\S" file.txt
    

দ্রষ্টব্য: আপনি যদি অযাচিত রঙগুলি পান তবে তার অর্থ আপনার grepএলিয়াস grep --color=auto(চেক আপ type grep)। --color=noneসেক্ষেত্রে আপনি প্যারামিটার যুক্ত করতে পারেন , বা কমান্ডটি চালাতে পারেন \grep(যা উপনামটিকে উপেক্ষা করে)।


ripgrep

একই সাথে ripgrep(অনেক বড় ফাইলের জন্য উপযুক্ত)।

ফাঁকা রেখাগুলি ফাঁকা জায়গাগুলির সাথে অন্তর্ভুক্ত নয়:

rg -N . file.txt

বা স্পেস সহ লাইন সহ:

rg -N "\S" file.txt

আরো দেখুন:


2
grep .সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে।
— লিও

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

1
@wisbucky আপনি রং দেখতে, কারণ grepওরফে অন্য grep --color=autoআপনার সিস্টেমে (দ্বারা চেক করুন: type grep)। আপনি এটি হিসাবে চালাতে পারেন \grepবা --color=noneপরামিতি ব্যবহার করতে পারেন ।
— কেনারব

@ টেনরব আপনি যদি ব্যবহার করেন তবে grep --color=none .সমস্ত সাদা টেক্সট পাবেন যা মূল কমান্ডের বর্ণ ফর্ম্যাটকে (উদাহরণস্বরূপ apt search foo)
— উইসবাকী

grep .কেবল ফাঁকা জায়গাগুলি যুক্ত লাইনগুলি মেলে যা ওপি বলেছে পছন্দসই নয়।
— জিম এল।

27
sed '/^$/d' file.txt

d একটি লাইন মুছে ফেলার জন্য sed কমান্ড। ^$কেবল একটি ফাঁকা রেখার সাথে মিলে যাওয়া একটি নিয়মিত প্রকাশ, একটি লাইন শেষে একটি লাইন প্রান্ত শুরু হয় by


ব্যাখ্যার জন্য +1
— অ্যালেক্স রাজ কালীমূর্তি

এই কমান্ডটি ওপি অনুরোধের মতো একই আউটপুট তৈরি করে না (এটি 5 টি নয়, 5 টি লাইন তৈরি করে)।
— কেনারব

22

ম্যাচিং খালি লাইনগুলি সরাতে আপনি গ্রেপ সহ -v বিকল্পটি ব্যবহার করতে পারেন।

এটার মত

grep -Ev "^$" file.txt

4
আমি বিশ্বাস করি না যে আপনার -Eজরুরী প্রয়োজন , কমপক্ষে জিএনইউ গ্রেপের সাথে নয়, তবে এর বাইরে গ্রেপ দিয়ে এই কাজটি দেখে আমি খুব সন্তুষ্ট! প্রতিবারই আমি সেডকে প্রাধান্য দিয়েছি; ইন-লাইন ফিল্টারগুলি আমাকে লাইন সম্পাদকদের চেয়ে ভাল বলে মনে হচ্ছে।
— ম্যাডহ্যাটার

আপনি যদি মন্তব্য ও ফাঁকা লাইনগুলি এড়িয়ে যেতে চান, বিশেষত কনফ ফাইলগুলির সাথে ডিল করার সময়grep -Ev '^#|^$' file.txt
— গোবিন্দ কৈলাস :11

7

এখানে একটি awkসমাধান:

awk NF file.txt

আওক দিয়ে, NFকেবল খালি ফাঁকা লাইনে সেট করুন। যখন এই শর্তটি মেলে, অব্ক ডিফল্ট ক্রিয়াটি পুরো লাইনটি মুদ্রণ করা।


6

খালি লাইনগুলি সরাতে, আপনি নতুন লাইনটি পুনরাবৃত্তিগুলি বার করতে পারবেন tr:

cat file.txt | tr -s '\n' '\n'

এটি ওপি অনুরোধ হিসাবে 4 টি নয়, 6 টি লাইন তৈরি করে।
— কেনারব

1

আপনি যদি শীর্ষস্থানীয় হোয়াইটস্পেস সরিয়ে ফেলার কথা মনে না করেন তবে xargs

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

প্রাক্তন / তেজ

exসম্পাদক (ভিমের অংশ) ব্যবহার করার পদ্ধতিটি এখানে :

ex -s +'v/\S/d' -cwq test.txt

একাধিক ফাইলের জন্য (জায়গায় জায়গায় সম্পাদনা করুন):

ex -s +'bufdo!v/\S/d' -cxa *.txt

দ্রষ্টব্য: :bufdoকমান্ডটি পসিক্স নয় ।

ফাইলটি পরিবর্তন না করে (কেবলমাত্র স্ট্যান্ডার্ড আউটপুট প্রিন্ট করুন):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

আমার জন্য @ মার্টিগিন-হিমেলস কমান্ডটি ত্রুটি ছুঁড়েছিল যা এটি স্থির করে (যেমন আমি একটি ডামি পরম),

sed -i '' '/^$/d' file.txt


0

ফাঁকা লাইনগুলি (ফাঁকা ছাড়াই) সরিয়ে ফেলার সম্ভবত সহজ উপায়টি হ'ল cat -s:

$ cat -s file
$ some-command | cat -s

অন্ততপক্ষে আপনি যদি কোনও জায়গায় স্থান পরিবর্তন করতে চান না তবে উদাহরণস্বরূপ টার্মিনালে লিখুন। এছাড়াও, এতে কোনও মজার রেজেক্স ব্যবসায় জড়িত না তাই এটি আর-আর-বান্ধব লোকদের জন্য এমনকি স্মরণ করা অত্যন্ত সহজ।


থেকে man cat:

-s, --squeeze-blank never more than one single blank line

বিভিন্ন ওএসে আলাদা হতে পারে তবে আমি লিনাক্স এবং ওপেনবিএসডি-তে সর্বশেষ উপস্থিত ছিলাম যখন আমি চেক করেছি।

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