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


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.