গ্রেপ দিয়ে ফাঁকা লাইন সরান


164

আমি grep -v '^$'লিনাক্সে চেষ্টা করেছি এবং এটি কার্যকর হয়নি। এই ফাইলটি একটি উইন্ডোজ ফাইল সিস্টেম থেকে এসেছে।

উত্তর:


300

নিম্নলিখিত চেষ্টা করুন:

grep -v -e '^$' foo.txt

-eবিকল্প মিলের জন্য Regex নিদর্শন পারেন।

চারপাশের একক উদ্ধৃতি ^$এটি শেলের পক্ষে কাজ করে। অন্যান্য শেলগুলি একক বা ডাবল উদ্ধৃতিতে খুশি হবে।

আপডেট: এটি ফাঁকা লাইন বা "সমস্ত সাদা স্থান" (যেমন "\ r \ n" স্টাইল লাইন সমাপ্তিযুক্ত উইন্ডোজ লাইন) সহ একটি ফাইলের জন্য আমার পক্ষে কাজ করে, যেখানে উপরেরগুলি কেবল ফাঁকা রেখা এবং ইউনিক্স স্টাইল লাইন সমাপ্ত ফাইলগুলি সরিয়ে দেয়:

grep -v -e '^[[:space:]]*$' foo.txt

এই egrep কেবল লাইনের শূন্য বা 1 স্পেসযুক্ত ফাইলগুলির জন্য কাজ করবে, 2 বা ততোধিক স্পেস সহ ফাইলগুলির জন্য নয়। পরিবর্তন ? প্রতি *.
এড মর্টন

4
এটি হওয়া উচিত grep -E -v, এর পরের সমস্ত কিছুকে -eনিদর্শন হিসাবে ব্যাখ্যা করা হয়।
জাজপি

6
grep -v -e '^[[:space:]]*$' -e '^#' fileআপনাকে স্ক্রিপ্ট বা কনফিগার ফাইলে (বা মন্তব্যগুলির জন্য হ্যাশ অক্ষর ব্যবহার করে এমন কোনও ফাইল টাইপ) সমস্ত নন-ফাঁকা, নন-মন্তব্য লাইন দেবে।
পালসুইম

" -eবিকল্পটি মিলে যাওয়ার জন্য রেজেক্স নিদর্শনগুলিকে মঞ্জুরি দেয়।" এটা খুব বিভ্রান্তিকর-eএটির জন্য একটি (POSIX-) সংজ্ঞা: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).( ম্যানুয়াল থেকে )। গ্রেপ ইতিমধ্যে একটি (বেসিক) নিয়মিত অভিব্যক্তি ডিফল্টরূপে প্রত্যাশা করে। এই প্যাটার্ন জন্য, আপনি বাদ দিতে পারে -eসম্পূর্ণরূপে: grep -v '^[[:space:]]*$' foo.txt
ইয়েতি

73

সহজবোধ্য রাখো.

grep . filename.txt

1
এটি আমাকে ফাইলের সমস্ত লাইন দেয়
ফুক্লভ

2
@ LưuVĩnhPhúc এটি ফাঁকা লাইন বাদে ফাইলের সমস্ত লাইন আউটপুট করা উচিত।
ফ্রেজ কনোলি

2
এটি আমার জন্য একটি লিনাক্স ভিত্তিক সিস্টেমের ফাইলগুলিতে কাজ করে তবে উইন্ডোজ থেকে ফাইলগুলিতে নয়। সম্ভবত উইন্ডোজ লাইন-শেষের অক্ষরগুলির কারণে।

যদিও আমি উইন্ডোজ লাইনের শেষের সাথে কোনও ফাইল পরিচালনার জন্য ওপি-র সমস্যাটি বেশ সমাধান করে না, তবে এটি আমার পক্ষে সঠিক সমাধান হিসাবে প্রমাণিত হয়েছে।
ডেভিড জেড

1
এই নিখুঁত সমাধান। সহজ এবং লিনাক্সে কাজ।
ডাব্লু 00f

30

ব্যবহার করুন:

$ dos2unix file
$ grep -v "^$" file

বা কেবল সহজভাবে

awk 'NF' file

আপনার যদি ডস 2 ইউনিক্স না থাকে তবে আপনি ট্র এর মতো সরঞ্জাম ব্যবহার করতে পারেন :

tr -d '\r' < "$file" > t ; mv t "$file"

ডস 2 ইউনিক্স প্রোগ্রামটি খুঁজে পাচ্ছে না। এটি কি উইন্ডোজের জন্য? জিজ্ঞাসা কমান্ড কাজ করে না।
নোড নিনজা

জিজ্ঞাসা? না, তাই awk
আইকনোক্লাস্ট 18

ইউনিক্স-স্টাইলের লাইনে শেষ রূপান্তর সম্পর্কে ভাল পয়েন্ট অন্যথায় নিয়মিত প্রকাশগুলি প্রত্যাশার মতো কাজ না করে not আমি লাইনের শেষটিকে রূপান্তর না করা পর্যন্ত এখানে কিছুই আমার পক্ষে কাজ করেনি।
রায়ান এইচ।

16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

কোড চালানো-

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

এটি কীভাবে / কেন কাজ করে সে সম্পর্কে আরও জানার জন্য, আমি নিয়মিত প্রকাশগুলি পড়ার পরামর্শ দিই। http://www.regular-expressions.info/tutorial.html


2
কিভাবে এবং কেন এই কাজ করে? আপনি উত্তর দিতে পারলে আপনার উত্তরটি আরও ভাল। উদাহরণস্বরূপ আপনার নিয়মিত প্রকাশটি স্ট্রিংয়ের শুরুতে মেলে তারপরে একটি বা একাধিক স্পেস দিয়ে পসিক্স স্ট্যান্ডার্ড ব্যবহার করে স্ট্রিংটির শেষ হয়, অর্থাত্ গ্রেপ-ভি দিয়ে এটি সমস্ত ফাঁকা স্থান সরিয়ে দেয় যা কেবল ফাঁকা থাকে। রাইট? জায়গা না থাকলে কী হয়; এটি কেবল একটি নতুন লাইনের চরিত্র?
বেন

আমার উদাহরণ হিসাবে দেখানো হয়েছে, এমনকি কেবল একটি খালি লাইন সরানো হয়েছে (প্রথম লাইন)। আমি আরও তথ্য যুক্ত করেছি, তাই আশা করি এটি সহায়তা করে। :)
সেপিরো

3

আমি ব্যবহার করতে পছন্দ করি egrep, যদিও ফাঁকা লাইনের সাথে একটি খাঁটি ফাইলের সাথে আমার পরীক্ষায় আপনার পদ্ধতির ভাল কাজ করেছে (যদিও আমার পরীক্ষায় উদ্ধৃতি চিহ্ন ছাড়া)) এটিও কাজ করেছে:

egrep -v "^(\r?\n)?$" filename.txt

চেষ্টা করেছেন। খালি লাইনগুলি এখনও প্রদর্শিত হচ্ছে। উইন্ডোজে ফাইলটি তৈরি হওয়ার কারণে এটি কি হতে পারে?
নোড নিনজা

3

আপনার যদি একাধিক ফাঁকা রেখার সারিতে ক্রম থাকে এবং ক্রমানুসারে কেবল একটি ফাঁকা রেখা চান, চেষ্টা করুন

grep -v "unwantedThing" foo.txt | cat -s

cat -s বারবার খালি আউটপুট লাইন দমন করে।

আপনার আউটপুট থেকে যেতে হবে

match1



match2

প্রতি

match1

match2

মূল আউটপুটে তিনটি ফাঁকা রেখা সংকুচিত বা "ফাঁকা" এক ফাঁকা লাইনে পরিণত হবে।



2

পূর্ববর্তী উত্তরগুলির মতো:

grep -v -e '^$' foo.txt

এখানে, grep -eএর বর্ধিত সংস্করণ মানে , grep । '^ $' এর অর্থ ^ (লাইনের শুরু) এবং $ (লাইনের শেষ) এর মধ্যে কোনও অক্ষর নেই। '^' এবং '$' হ'ল রেগেক্স অক্ষর।

সুতরাং কমান্ডটি grep -vসমস্ত রেখা মুদ্রণ করবে যা এই প্যাটার্নের সাথে মেলে না (^ এবং between এর মধ্যে কোনও অক্ষর নেই)।

এইভাবে, খালি ফাঁকা লাইনগুলি মুছে ফেলা হয়।


-e"গ্রেপ এর বর্ধিত সংস্করণ" এর অর্থ এই নয়, সম্ভবত আপনি কি বিভ্রান্ত -E? ম্যানুয়ালটি পরিষ্কারভাবে বলেছে যে -eকেবল স্পষ্টভাবে বলে যে একটি প্যাটার্ন অনুসরণ করে। যেহেতু প্যাটার্নটি কোনও ড্যাশ দিয়ে শুরু হয় না এবং আপনি কেবল একটি প্যাটার্নটি নির্ধারণ করছেন, তাই আপনি সম্ভবত এটি ছেড়ে দিতে পারেন কারণ ডিফল্ট গ্রেপ একটি রেজেক্স প্যাটার্ন আশা করে: grep -v '^$' foo.txt(এক্সটেন্ডেড রেজেক্স কার্যকারিতার প্রয়োজন নেই)) এছাড়াও এটি উল্লেখযোগ্য যে এটি ফাইলের ফাঁকা লাইনগুলি সরিয়ে দেয় না, কেবলমাত্র আউটপুট দিয়ে পাইপ করা হয়। এই ক্ষেত্রে, sed -iসঠিক সরঞ্জাম হবে।
ইয়েতি

1

আমি কঠোর চেষ্টা করেছি, তবে এটি কাজ করছে বলে মনে হচ্ছে (ধরে \rনিচ্ছে এখানে আপনাকে কামড় দিচ্ছে ):

printf "\r" | egrep -xv "[[:space:]]*"

এটি কাজ করে যদি আমি প্রথম অংশটি ফাইল থেকে আউটপুট দিয়ে প্রতিস্থাপন করি।
নোড নিনজা


0

egrep -v "^ \ s \ s +"

উদাহরণস্বরূপ ইতোমধ্যে রেগেক্স করেছে, এবং and গুলি সাদা স্থান।

+ + বর্তমান প্যাটার্ন সদৃশ।

^ শুরু করার জন্য


0

ব্যবহার করুন:

grep pattern filename.txt | uniq

uniqসংযুক্ত ফাঁকা রেখাগুলি কেবলমাত্র একটি ফাঁকা লাইনে হ্রাস করবে, তবে সেগুলি পুরোপুরি সরিয়ে ফেলবে না। তবুও, আমি এটির মতো ব্যবহার করার চেষ্টা করতে uniqচাই। প্রথমে বাছাই করা কার্যকরভাবে সমস্ত ফাঁকা লাইন সরিয়ে ফেলবে - কেবল একটি রেখে, তবে লাইন ক্রমটি পুনরায় সাজানো গ্রহণযোগ্য হবে না।
জ্যাচ ইয়ং

ভাল যুক্তি. এটি পুনরাবৃত্তি লাইন chomp হবে। আমার ধারণা আমার সমাধানগুলি বাগগুলি প্রবর্তন করে।
বাইতজ

0

#সাইন দিয়ে শুরু করা সাদা লাইন এবং লাইনগুলি অপসারণের আরও একটি উপায় এখানে । আমি মনে করি কনফিগারেশন ফাইলগুলি পড়ার জন্য এটি বেশ দরকারী।

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

0

এটি সত্য যে গ্রেপ-ভি-'' $ $ 'এর ব্যবহার কাজ করতে পারে, তবে এটিতে খালি রেখাগুলি সরিয়ে দেয় না যার মধ্যে 1 বা একাধিক স্পেস রয়েছে । ফাঁকা লাইনগুলি সরিয়ে ফেলার জন্য আমি সবচেয়ে সহজ এবং সহজ উত্তরটি পেয়েছি করণীয় ব্যবহার । উপরোক্ত অজানা লোকগুলি থেকে নিম্নলিখিতটি কিছুটা সংশোধিত:

awk 'NF' foo.txt

তবে যেহেতু এই প্রশ্নটি গ্রেপ ব্যবহারের জন্য, আমি নীচের উত্তরগুলি দিতে যাচ্ছি:

grep -v '^ *$' foo.txt

দ্রষ্টব্য : ^ এবং * এর মধ্যে ফাঁকা স্থান।

অথবা আপনি ফাঁকা স্থান উপস্থাপন করতে use গুলি ব্যবহার করতে পারেন:

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