Unix (रिक्त स्थान सहित) में किसी फ़ाइल से रिक्त / रिक्त लाइनों को कैसे निकालें?


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, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

जवाबों:


86

इस सेड लाइन को करना चाहिए ट्रिक:

sed -i '/^$/d' file.txt

इसका -iमतलब है कि यह फाइल को इन-प्लेस करेगा।


13
यह वास्तव में लाइनों को हटाने के लिए "/ ^ * $ / d" होना चाहिए जिसमें केवल रिक्त स्थान होते हैं।
सीन रिफ़्स्चाइडर

2
@SeanReifschneider जब यह उत्तर लिखा गया था, तो उस प्रश्न की आवश्यकता नहीं थी?
कास्परड

4
@SeanReifschneider "/ ^ \ s * $ / d" बेहतर नहीं होगा क्योंकि इसमें टैब शामिल होंगे? जबकि इसका मूल पोस्ट में उल्लेख नहीं है, यह मुझे एक मजबूत विकल्प लगता है।
mrswadge


मुझे मिलता हैbad flag in substitute command: 'e'
ishandutta2007

29

grep

नीचे के रूप में grep( GNU या BSD ) कमांड का उपयोग करके सरल समाधान है ।

  • रिक्त लाइनें निकालें (रिक्त स्थान वाली रेखाओं सहित नहीं)।

    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 ^$
wisbucky

1
@wisbucky आप रंग देखते हैं, क्योंकि grepपर एलियास है grep --color=autoआपके सिस्टम पर (द्वारा की जाँच करें: type grep)। आप इसे पैरामीटर के रूप में चला सकते हैं \grepया उपयोग कर सकते हैं --color=none
kenorb

@kenorb आप का उपयोग करते हैं grep --color=none .: (उदाहरण के लिए, आप सभी सफेद पाठ है, जो मूल आदेश के रंग स्वरूपण को ओवरराइड करता मिल जाएगा apt search foo)
wisbucky

grep .केवल रिक्त स्थान वाली रेखाओं से मेल खाएगा, जिसे ओपी कहता है कि वह वांछित नहीं है।
जिम एल।

27
sed '/^$/d' file.txt

d एक लाइन हटाने के लिए sed कमांड है। ^$एक नियमित अभिव्यक्ति है जो केवल एक रिक्त रेखा से मेल खाती है, एक पंक्ति शुरू होती है जिसके बाद एक पंक्ति समाप्त होती है।


स्पष्टीकरण के लिए +1
एलेक्स राज कालीमूर्ति

यह कमांड ओपी के अनुरोध के समान उत्पादन नहीं करता है (यह 5 लाइनें बनाता है, 4 नहीं)।
kenorb

22

मिलान खाली लाइनों को हटाने के लिए आप grep के साथ -v विकल्प का उपयोग कर सकते हैं।

ऐशे ही

grep -Ev "^$" file.txt

4
मुझे विश्वास नहीं है कि आपको -Eकम से कम जीएनयू grep के साथ की आवश्यकता नहीं है, लेकिन इसके अलावा मुझे grep के साथ ऐसा करने की खुशी है! यह वह है जो मैं हर बार सेड करने के लिए पसंद करता हूं; इन-लाइन फ़िल्टर मुझे इन-लाइन संपादकों से बेहतर लगते हैं।
मैडहैटर

यदि आप टिप्पणी और रिक्त लाइनों को छोड़ना चाहते हैं, विशेष रूप से गोपनीय फाइलों के उपयोग से निपटने के दौरानgrep -Ev '^#|^$' file.txt
गोविंद कैलास

7

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

awk NF file.txt

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


6

खाली लाइनों को हटाने के लिए, आप नई पंक्ति को दोहरा सकते हैं tr:

cat file.txt | tr -s '\n' '\n'

यह 6 लाइनों का उत्पादन करता है, 4 नहीं जैसा कि ओपी ने अनुरोध किया है।
kenorb

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कमांड POSIX नहीं है ।

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

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

कम से कम यदि आप किसी फ़ाइल को इन-प्लेस नहीं करना चाहते हैं, लेकिन उदाहरण के लिए टर्मिनल के बजाय लिखें। इसके अलावा, यह किसी भी अजीब regex व्यवसाय को शामिल नहीं करता है, इसलिए गैर-आरई-अनुकूल लोगों के लिए भी याद रखना आसान है।


से man cat:

-s, --squeeze-blank never more than one single blank line

अलग-अलग OS पर भिन्न हो सकते हैं लेकिन पिछली बार जब मैंने जाँच की तो कुछ Linux और OpenBSD पर मौजूद था।

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