फ़ाइल (टैब और रिक्त स्थान सहित) से रिक्त लाइनें कैसे निकालें?


23

मैं एक फाइल से सभी खाली लाइनों को हटाना चाहता हूं। यहां तक ​​कि अगर लाइन में स्थान या टैब शामिल हैं, तो इसे भी हटा दिया जाना चाहिए।

जवाबों:


26

सिर्फ grepगैर-रिक्त स्थान के लिए:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], अंदर वर्ण श्रेणियों ( [...]), को POSIX वर्ण वर्ग कहा जाता है। कुछ ऐसे होते हैं [:alpha:], [:digit:]... [:blank:]क्षैतिज सफेद स्थान से मेल खाता है (POSIX लोकेल में, वह स्थान और टैब है, लेकिन अन्य स्थानों में अधिक हो सकता है, जैसे कि यूटीएफ 8 स्थानों में सभी यूनिकोड क्षैतिज रिक्ति वर्ण) जबकि [[:space:]]क्षैतिज और ऊर्ध्वाधर सफेद मेल खाते हैं अंतरिक्ष वर्ण ( [:blank:]ऊर्ध्वाधर टैब जैसी अतिरिक्त चीजें, प्रपत्र फ़ीड ...)।

grep '[:blank:]'

लाइनों है कि कोई भी वर्ण हो जाएंगे :, b, l, a, nया k। चरित्र वर्ग केवल सेट के भीतर [...]और ^भीतर ही पहचाने जाते हैं [...]। तो [^[:blank:]]किसी भी चरित्र का मतलब है, लेकिन खाली।


1
क्या $पंक्ति के अंत के लिए भी होना चाहिए ?
माइकल डुरंट


1
@MichaelDurrant। [^[:blank:]]$केवल एक गैर-रिक्त में समाप्त होने वाली रेखाओं से मेल खाएगा। हम ऐसी लाइनें चाहते हैं जिनमें कहीं भी
स्टीफन चेज़लस

@StephaneChazelas मैंने grep की कोशिश की [: blank:] SOURCEFILE यहां तक ​​कि यह कमांड भी काम कर रहा है। मैं समझता हूं कि [] चरित्र वर्ग के लिए है क्या आप मुझे इस पर कुछ विचार दे सकते हैं कि यह कैसे काम करता है? स्निपेट: रिक्त: मेरे लिए नया है।
जमशेद अंसारी user3000272

क्या कोई ऐसे मामले हैं जहां grep -E '\S'काम नहीं करेगा?
terdon

21

यहाँ एक awkसमाधान है:

$ awk NF file

के साथ awk, NFकेवल गैर-रिक्त लाइनों पर सेट करें। जब यह स्थिति मेल खाती है, तो awkडिफ़ॉल्ट कार्रवाई जो printपूरी लाइन को प्रिंट करेगी।


नीट, यह व्हाट्सएप के साथ लाइनों को भी हटाता है।
वारबकी

7

कैसा रहेगा:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

या

sed -e '/^[[:blank:]]*$/d' source_file > newfile

अर्थात

प्रत्येक पंक्ति के लिए, विकल्प:

  • अगर यह शुरू होता है (" ^")
  • रिक्त स्थान या टैब (" [[:blank:]]") के साथ शून्य या अधिक बार (" *")
  • और फिर लाइन का अंत है (" $")

अधिक जानकारी :: रिक्त :: http://www.zytrax.com/tech/web/regex.htm#special पर अन्य विशेष वर्ण


4
[[:space:]]टैब शामिल हैं। यदि यह आपके रेगेक्स विफल नहीं होता अगर एक स्थान एक टैब का पालन करता है।
जोर्डनम

wctype(3)और isalpha(3)manpages वर्णन चरित्र वर्गों क्या से मेल खाएगी।
जोर्डनम

आप पहले वाले को हटाना चाहते हैं जो सवाल का जवाब नहीं देता।
स्टीफन चेजलस

@MichaelDurrant क्या आप कृपया [[: blank:]] के बारे में कुछ लिख सकते हैं?
जमशेद अंसारी user3000272

[[: रिक्त ::]] के लिए जानकारी जोड़ी गई। स्टीफन, पहला काम क्यों नहीं करता है? मैंने सोचा कि // अंत में कुछ भी नहीं के बिना लाइन की जगह लेगा।
माइकल डुरंट

4

आप sedरिक्त लाइनों को हटाने के लिए कमांड का उपयोग कर सकते हैं :

sed '/^$/d' in > out

यह कमांड "" में फ़ाइल से सभी खाली लाइनों को हटा देती है


विशेष रूप से अनुरोध के अनुसार, केवल स्थान और टैब वाली रेखाओं को हटाता नहीं है।
dave_thompson_085

3

ऐसा लगता है कि मैंने पाया है कि एक तेज नहीं है, लेकिन आखिरी में अजीब है:

| xargs -L1


1
अच्छा एक है, लेकिन यह अधिक है: प्रमुख स्थानों और टैब को भी हटा दें।
जूलियट

ओह, यह और भी अधिक सक्षम पाया गया है? - अच्छा लगा! ; -प
पूय जूल

1
और यह लाइनों को काट देती है (1024 वर्णों पर डिफ़ॉल्ट) manpages देखें: linux.die.net/man/1/xargs
jringoot

मैं उस सरल उपकरण के साथ प्यार में गहरा पड़ रहा हूँ !!! 11)
जूल

0

पूर्व- प्रयास करें :

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

कई फ़ाइलों के लिए (जगह में संपादित करें):

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

नोट: :bufdoकमांड POSIX नहीं है ।

फ़ाइल को संशोधित किए बिना (केवल मानक आउटपुट पर प्रिंट करें):

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


0

निम्नलिखित आदेश का उपयोग करें:

grep '\S' FILE

जो रिक्त स्थान या टैब सहित सभी लाइनों को हटा देता है।

अन्यथा, रिक्त स्थान / टैब के साथ लाइनों को शामिल नहीं करना, उपयोग:

grep . FILE

उदाहरण के लिए:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

यह भी देखें:

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