जवाबों:
निम्नलिखित आज़माएँ:
grep -v -e '^$' foo.txt
-e
विकल्प मिलान के लिए regex पैटर्न अनुमति देता है।
चारों ओर एकल उद्धरण ^$
यह Cshell के लिए काम करता है। अन्य गोले एकल या दोहरे उद्धरणों से खुश होंगे।
अद्यतन: यह मेरे लिए रिक्त लाइनों या "सभी सफ़ेद स्थान" (जैसे "\ r \ n" स्टाइल लाइन एंडिंग वाली विंडोज़ लाइनें) के लिए एक फ़ाइल के लिए काम करता है, जबकि ऊपर केवल रिक्त लाइनों और यूनिक्स शैली लाइन के साथ फ़ाइलें निकालता है:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
बाद -e
यह सब कुछ होना चाहिए ।
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
:।
इसे सरल रखें।
grep . filename.txt
उपयोग:
$ dos2unix file
$ grep -v "^$" file
या बस बस जाग:
awk 'NF' file
यदि आपके पास dos2unix नहीं है, तो आप tr जैसे टूल का उपयोग कर सकते हैं :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
।
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
मैं उपयोग करना पसंद करता हूं egrep
, हालांकि रिक्त लाइन के साथ एक वास्तविक फ़ाइल के साथ मेरे परीक्षण में आपके दृष्टिकोण ने ठीक काम किया (हालांकि मेरे परीक्षण में उद्धरण चिह्नों के बिना)। यह भी काम किया:
egrep -v "^(\r?\n)?$" filename.txt
यदि आपके पास एक पंक्ति में कई रिक्त लाइनों के अनुक्रम हैं, और प्रति अनुक्रम केवल एक रिक्त रेखा चाहते हैं, तो प्रयास करें
grep -v "unwantedThing" foo.txt | cat -s
cat -s
बार-बार खाली आउटपुट लाइनों को दबाता है।
आपके आउटपुट से जाना होगा
match1
match2
सेवा
match1
match2
मूल आउटपुट में तीन रिक्त लाइनें संकुचित या "निचोड़ा हुआ" एक रिक्त पंक्ति में होगी।
पिछले उत्तरों की तरह ही:
grep -v -e '^$' foo.txt
यहाँ, grepgrep -e
के विस्तारित संस्करण का मतलब है । '^ $' का अर्थ है कि ^ (पंक्ति का प्रारंभ) और $ (पंक्ति का अंत) के बीच कोई वर्ण नहीं है। '^' और '$' रेगेक्स वर्ण हैं।
तो कमांड grep -v
उन सभी लाइनों को प्रिंट करेगा जो इस पैटर्न से मेल नहीं खाते (^ और $ के बीच कोई वर्ण नहीं)।
इस तरह, खाली खाली लाइनें समाप्त हो जाती हैं।
-e
"जीआरपी के विस्तारित संस्करण" का मतलब यह नहीं है, शायद आप उलझन में हैं -E
? मैनुअल स्पष्ट रूप से कहता है कि -e
बस स्पष्ट रूप से कहता है कि एक पैटर्न निम्नानुसार है। चूंकि पैटर्न डैश के साथ शुरू नहीं होता है, और आप केवल एक पैटर्न को परिभाषित कर रहे हैं, इसलिए आप इसे भी छोड़ सकते हैं क्योंकि डिफ़ॉल्ट grep एक regex पैटर्न की उम्मीद करता है: grep -v '^$' foo.txt
(विस्तारित रेगेक्स कार्यक्षमता की कोई आवश्यकता नहीं)। यह भी ध्यान देने योग्य है कि यह फ़ाइल में रिक्त लाइनों को समाप्त नहीं करता है, केवल वही जो आउटपुट के माध्यम से पाइप किया गया है। उस स्थिति के लिए, sed -i
सही उपकरण होगा।
पर्ल का उपयोग करना:
perl -ne 'print if /\S/'
\S
का अर्थ है गैर-रिक्त वर्णों से मेल खाना।
egrep -v "^ \ s \ s +"
egrep पहले से ही regex करते हैं, और \ n सफेद स्थान है।
वर्तमान पैटर्न को + डुप्लिकेट करता है।
^ शुरुआत के लिए है
उपयोग:
grep pattern filename.txt | uniq
uniq
निकटवर्ती रिक्त लाइनों को केवल एक रिक्त रेखा तक कम कर देगा, लेकिन उन्हें पूरी तरह से हटा नहीं सकता है। फिर भी, मैं uniq
उस तरह का उपयोग करने की कोशिश कर रहा हूं । छँटाई पहले प्रभावी रूप से सभी खाली लाइनों को हटा देगा - सिर्फ एक को छोड़कर, लेकिन लाइन ऑर्डर को फिर से व्यवस्थित करना स्वीकार्य नहीं हो सकता है।
यहां #
साइन के साथ शुरू होने वाली सफेद लाइनों और लाइनों को हटाने का एक और तरीका है । मुझे लगता है कि कॉन्फ़िगरेशन फ़ाइलों को पढ़ने के लिए यह काफी उपयोगी है।
[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
यह सच है कि grep -v -e '^ $' का उपयोग काम कर सकता है, हालांकि यह उन खाली लाइनों को नहीं हटाता है जिनमें 1 या अधिक रिक्त स्थान होते हैं । मुझे खाली लाइनों को हटाने के लिए सबसे आसान और सरल उत्तर मिला, यह जाग का उपयोग है । निम्नलिखित ऊपर के awk लोगों से थोड़ा संशोधित है:
awk 'NF' foo.txt
लेकिन चूंकि यह सवाल grep का उपयोग करने के लिए है, इसलिए मैं निम्नलिखित उत्तर देने जा रहा हूं:
grep -v '^ *$' foo.txt
नोट : ^ और * के बीच रिक्त स्थान।
या आप रिक्त स्थान का प्रतिनिधित्व करने के लिए इस तरह का उपयोग कर सकते हैं:
grep -v '^\s*$' foo.txt