खाली लाइनों को grep के साथ निकालें


164

मैंने grep -v '^$'लिनक्स में कोशिश की और वह काम नहीं किया। यह फाइल विंडोज फाइल सिस्टम से आई है।

जवाबों:


300

निम्नलिखित आज़माएँ:

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

-eविकल्प मिलान के लिए regex पैटर्न अनुमति देता है।

चारों ओर एकल उद्धरण ^$यह Cshell के लिए काम करता है। अन्य गोले एकल या दोहरे उद्धरणों से खुश होंगे।

अद्यतन: यह मेरे लिए रिक्त लाइनों या "सभी सफ़ेद स्थान" (जैसे "\ 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
यह मुझे फाइल में सभी पंक्तियाँ देता है
phuclv

2
@ LưuV LnhPhúc यह रिक्त लाइनों को छोड़कर फ़ाइल में सभी लाइनों का उत्पादन करना चाहिए।
फ्रीज कोनोली

2
यह मेरे लिए लिनक्स आधारित सिस्टम की फाइलों पर काम करता है, लेकिन विंडोज की फाइलों पर नहीं। संभवतः विंडोज लाइन-एंडिंग वर्णों के कारण।

मैं इसे अपवोट कर रहा हूं, भले ही यह विंडोज लाइन एंडिंग के साथ एक फ़ाइल को संभालने की ओपी की समस्या को काफी हल नहीं करता है, लेकिन जब से मेरे पास यह मुद्दा नहीं है, यह मेरे लिए सही समाधान निकला।
डेविड जेड

1
यह अचूक उपाय है। सरल और लिनक्स पर काम किया।
W00f

30

उपयोग:

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

या बस बस जाग:

awk 'NF' file

यदि आपके पास dos2unix नहीं है, तो आप tr जैसे टूल का उपयोग कर सकते हैं :

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

प्रोग्राम dos2unix नहीं ढूँढ सकता। क्या यह विंडोज के लिए है? पूछें आदेश या तो काम नहीं करता है।
नोड निन्जा

पूछना? नहीं, वह awk
आइकनोकॉस्ट

UNIX- शैली की रेखा के अंत में परिवर्तित होने के बारे में अच्छा बिंदु अन्यथा नियमित अभिव्यक्तियाँ अपेक्षा के अनुरूप काम नहीं कर सकती हैं। यहां तक ​​मेरे लिए कुछ भी काम नहीं किया जब तक कि मैंने लाइन एंडिंग्स को परिवर्तित नहीं किया।
रयान एच।

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
यह कैसे और क्यों काम करता है? यदि आप समझा सकते हैं तो आपका उत्तर बहुत बेहतर होगा। उदाहरण के लिए आपकी नियमित अभिव्यक्ति स्ट्रिंग की शुरुआत से मेल खाती है तो POSIX मानक का उपयोग करके एक या एक से अधिक रिक्त स्थान, फिर स्ट्रिंग का अंत, अर्थात grep -v के साथ यह उन सभी लाइनों को हटा देता है जो केवल रिक्त स्थान हैं। सही? यदि रिक्त स्थान नहीं हैं तो क्या होगा; यह केवल एक नया चरित्र है?
बेन

जैसा कि मेरे उदाहरण से पता चलता है, यहां तक ​​कि केवल एक खाली रेखा को हटा दिया जाता है (पहली पंक्ति)। मैंने और जानकारी जोड़ी, इसलिए उम्मीद है कि इससे मदद मिलेगी। :)
सेपरो

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

यहाँ, grepgrep -e के विस्तारित संस्करण का मतलब है । '^ $' का अर्थ है कि ^ (पंक्ति का प्रारंभ) और $ (पंक्ति का अंत) के बीच कोई वर्ण नहीं है। '^' और '$' रेगेक्स वर्ण हैं।

तो कमांड grep -vउन सभी लाइनों को प्रिंट करेगा जो इस पैटर्न से मेल नहीं खाते (^ और $ के बीच कोई वर्ण नहीं)।

इस तरह, खाली खाली लाइनें समाप्त हो जाती हैं।


-e"जीआरपी के विस्तारित संस्करण" का मतलब यह नहीं है, शायद आप उलझन में हैं -E? मैनुअल स्पष्ट रूप से कहता है कि -eबस स्पष्ट रूप से कहता है कि एक पैटर्न निम्नानुसार है। चूंकि पैटर्न डैश के साथ शुरू नहीं होता है, और आप केवल एक पैटर्न को परिभाषित कर रहे हैं, इसलिए आप इसे भी छोड़ सकते हैं क्योंकि डिफ़ॉल्ट grep एक regex पैटर्न की उम्मीद करता है: grep -v '^$' foo.txt(विस्तारित रेगेक्स कार्यक्षमता की कोई आवश्यकता नहीं)। यह भी ध्यान देने योग्य है कि यह फ़ाइल में रिक्त लाइनों को समाप्त नहीं करता है, केवल वही जो आउटपुट के माध्यम से पाइप किया गया है। उस स्थिति के लिए, sed -iसही उपकरण होगा।
यति

1

मैंने बहुत कोशिश की, लेकिन यह काम करने लगता है (यह मानते हुए \rकि आप यहाँ काट रहे हैं):

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

अगर मैं फ़ाइल से आउटपुट के साथ पहले भाग को प्रतिस्थापित करता हूं तो यह काम करता है।
नोड निंजा


0

egrep -v "^ \ s \ s +"

egrep पहले से ही regex करते हैं, और \ n सफेद स्थान है।

वर्तमान पैटर्न को + डुप्लिकेट करता है।

^ शुरुआत के लिए है


0

उपयोग:

grep pattern filename.txt | uniq

uniqनिकटवर्ती रिक्त लाइनों को केवल एक रिक्त रेखा तक कम कर देगा, लेकिन उन्हें पूरी तरह से हटा नहीं सकता है। फिर भी, मैं uniqउस तरह का उपयोग करने की कोशिश कर रहा हूं । छँटाई पहले प्रभावी रूप से सभी खाली लाइनों को हटा देगा - सिर्फ एक को छोड़कर, लेकिन लाइन ऑर्डर को फिर से व्यवस्थित करना स्वीकार्य नहीं हो सकता है।
जैच यंग

अच्छी बात। इससे बार-बार होने वाली लाइनों में भी कमी आएगी। मुझे लगता है कि मेरा समाधान बग का परिचय देता है।
बैयिटज

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

यह सच है कि grep -v -e '^ $' का उपयोग काम कर सकता है, हालांकि यह उन खाली लाइनों को नहीं हटाता है जिनमें 1 या अधिक रिक्त स्थान होते हैं । मुझे खाली लाइनों को हटाने के लिए सबसे आसान और सरल उत्तर मिला, यह जाग का उपयोग है । निम्नलिखित ऊपर के awk लोगों से थोड़ा संशोधित है:

awk 'NF' foo.txt

लेकिन चूंकि यह सवाल grep का उपयोग करने के लिए है, इसलिए मैं निम्नलिखित उत्तर देने जा रहा हूं:

grep -v '^ *$' foo.txt

नोट : ^ और * के बीच रिक्त स्थान।

या आप रिक्त स्थान का प्रतिनिधित्व करने के लिए इस तरह का उपयोग कर सकते हैं:

grep -v '^\s*$' foo.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.