Sed का उपयोग करके खाली लाइनें हटाएं


351

मैं sed का उपयोग करके खाली लाइनों को हटाने की कोशिश कर रहा हूं:

sed '/^$/d'

लेकिन मुझे इससे कोई मतलब नहीं है।

उदाहरण के लिए, मेरे पास ये लाइनें हैं:

xxxxxx


yyyyyy


zzzzzz

और मैं चाहता हूं कि यह हो:

xxxxxx
yyyyyy
zzzzzz

इसके लिए क्या कोड होना चाहिए?


2
आपकी sed कमांड ठीक दिखती है, इसे काम करना चाहिए
perreal

यदि आपके पास कोई स्पेस / टैब नहीं है, लेकिन CR + LF लाइन एंडिंग्स हैं , तो भी उपरोक्त कमांड काम नहीं करेगा ।
देवनाउल

जवाबों:


628

आपके "रिक्त" लाइन में स्थान या टैब हो सकते हैं। उपयोग POSIX वर्गों के साथ sedइसमें केवल रिक्त स्थान युक्त सभी लाइनों को हटाने के लिए:

sed '/^[[:space:]]*$/d'

एक छोटा संस्करण जो ERE का उपयोग करता है, उदाहरण के लिए gnu sed के साथ:

sed -r '/^\s*$/d'

(ध्यान दें कि sed पीसीआरई का समर्थन नहीं करता है ।)


3
@HuStmpHrrr gnu sed PCRE का बिल्कुल समर्थन नहीं करता है। यह ERE के साथ है-r
केंट

8
ओएस एक्स की जरूरत है sed -i "" '/^[[:space:]]*$/d' <filename>,
jww

@BernieReiter ^\s*$सभी "खाली" लाइनों से मेल खाएगा, यहाँ खाली का मतलब है, लाइन में कोई वर्ण नहीं है, या लाइन में केवल खाली तार (जैसे रिक्त स्थान) हैं। सभी मिलान लाइनों को dकमांड के साथ, sed द्वारा हटा दिया जाएगा ।
कैंट

97

मुझे awkहल याद आ रहा है :

awk 'NF' file

जो लौटेगा:

xxxxxx
yyyyyy
zzzzzz

यह कैसे काम करता है? चूंकि NF"फ़ील्ड्स की संख्या" के लिए खड़ा है, उन रेखाओं के खाली होने में 0 फ़िडेल्स हैं, जिससे कि awk 0 का गलत मूल्यांकन करता है और कोई भी रेखा मुद्रित नहीं होती है; हालाँकि, यदि कम से कम एक फ़ील्ड है, तो मूल्यांकन सही है और awkअपनी डिफ़ॉल्ट क्रिया करता है: वर्तमान लाइन प्रिंट करें।


1
Whoah। यहां तक ​​कि बीएसडी के "मिनीमाइज़" संस्करण के साथ भी चल रहा है (संस्करण 20121220 (FreeBSD)। धन्यवाद :-)
बर्नी रीटर

@BernieReiter आपका स्वागत है :) हाँ, यह एक बहुत ही बुनियादी मुहावरेदार बात है जो सभी जाग संस्करणों की अनुमति देती है।
फेडोरक्वी 'SO रोकना नुकसानदेह'

और यह बहुत तेज है, हालांकि - एक त्वरित और गंदे परीक्षण के लिए - मैं दो बार awk का आह्वान कर रहा हूं: $ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s क्या आप इसे एक awk-script में शामिल करने के लिए निफ्टी तरीके से जानते होंगे, जैसे, एक पैटर्न? awk '/ mypattern / {do stuff ...}'
Bernie Reiter

@BernieReiter आप कह सकते हैं awk 'NF {do stuff...}'
फेडोरक्वी 'एसओ स्टॉप हानिंग'

1
ध्यान दें कि यह केवल व्हाट्सएप के साथ लाइनों की उपेक्षा करेगा।
बुद्धिमत्ता

60

sed '/^$/d'ठीक होना चाहिए, आप जगह में फ़ाइल को संशोधित करने की उम्मीद कर रहे हैं? यदि ऐसा है तो आपको -iध्वज का उपयोग करना चाहिए ।

हो सकता है कि वे लाइनें खाली न हों, इसलिए यदि ऐसा है, तो इस प्रश्न को देखें। txtfiles से खाली लाइनों को हटा दें, लाइन के शुरू और अंत से रिक्त स्थान हटा दें। मेरा मानना ​​है कि आप जो हासिल करना चाहते हैं।


हाँ। मैं एक फ़ाइल को संशोधित कर रहा हूँ। * .csv। कैसे sed कमांड के लिए रखा जाना चाहिए?
जोनास

2
sed -i '/^$/d'यह करने का एक तरीका है।
अल्बर्टो ज़क्काग्नि

49

1
ये आपके ऑनलाइन टूल में सही तरीके से दिखाई देते हैं, लेकिन एक ब्रैकेट अभिव्यक्ति में बच नहीं[] जाना चाहिए , इसलिए यहाँ कोड के लिए सही नहीं है - या होना चाहिए और । \[\[:space:\]\]\[ \t\][[:space:]][ \t]
बेंजामिन डब्ल्यू।

1
@BenjaminW। उस पकड़ने के लिए धन्यवाद। वे मूल लेखक से नहीं थे, लेकिन एडिट 3 से आया जब इसे नियमित पाठ से "कोड" में बदल दिया गया था, जो तब `\ _ 'से बचकर निकल गया। मैंने उन्हें अब ठीक कर दिया है।
वारबकी

30

मेरा मानना ​​है कि यह सबसे आसान और सबसे तेज़ है:

cat file.txt | grep .

यदि आपको सभी श्वेत-स्थान रेखाओं को अनदेखा करने की आवश्यकता है, तो यह प्रयास करें:

cat file.txt | grep '\S'

उदाहरण:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

आउटपुट

7
5

5
इसके लिए कोई आवश्यकता नहीं है cat, grepसाथ ही फाइल भी लेता है:grep . file.txt
सिरो सेंटिल्ली files files files files files files

3
हां, मुझे पता है, लेकिन प्रारंभिक प्रश्न में यह उल्लेख नहीं किया गया है कि स्रोत एक फाइल है या कुछ और, इसलिए समाधान "" | "के बाद आता है, और इससे पहले कि यह स्रोत का एक उदाहरण है। बस लाइनों के स्रोत से समाधान को भेद करने के लिए।
वादिम

2
grep '\S'निश्चित रूप से पोर्टेबल नहीं है। यदि आपके पास है grep -Pतो आप उपयोग कर सकते हैं grep -P '\S'लेकिन यह सभी प्लेटफार्मों पर समर्थित नहीं है।
6

grep .अन्य समाधानों की तुलना में नकारात्मक पक्ष यह है कि यह लाल रंग के सभी पाठ को उजागर करेगा। अन्य समाधान मूल रंगों को संरक्षित कर सकते हैं। तुलना unbuffer apt search foo | grep .करेंunbuffer apt search foo | grep -v ^$
बुद्धिमानबीज

15

यहाँ स्वीकृत उत्तर और उपर्युक्त उत्तर की सहायता से, मैंने उपयोग किया है:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

यह सभी आधारों को कवर करता है और मेरी जरूरतों के लिए पूरी तरह से काम करता है। कुडोस मूल पोस्टर @Kent और @kev के लिए


5

तुम कह सकते हो:

sed -n '/ / p' filename    #there is a space between '//'

.. जिसका अर्थ है print all lines except the empty one(s)और शांत
तिमो

3

एक अन्य विकल्प के बिना sed, awk, perl, आदि

strings $file > $output

स्ट्रिंग्स - फाइलों में प्रिंट करने योग्य पात्रों के तारों को प्रिंट करें।


के stringsबजाय आप का मतलब है string?
मिकेल बी

2

आप "grep" का उपयोग करके ऐसा कुछ कर सकते हैं:

egrep -v "^$" file.txt


2

आप अप्रत्याशित व्यवहार को देखने की सबसे अधिक संभावना रखते हैं क्योंकि आपकी पाठ फ़ाइल विंडोज पर बनाई गई थी, इसलिए लाइन अनुक्रम का अंत है \r\n। आप sed या उपयोग करने से पहले इसे UNIX शैली की टेक्स्ट फ़ाइल में बदलने के लिए dos2unix का उपयोग कर सकते हैं

sed -r "/^\r?$/d"

खाली लाइनों को हटाने के लिए गाड़ी वापसी है या नहीं।


नमस्ते, -rध्वज क्या कर रहा है और क्या इसे -iसीधे फाइल को संशोधित करने और स्क्रीन पर मुद्रण से बचने के साथ संयोजन करना संभव है । इसके अलावा, मुझे लगता है कि यह कमांड भी काम करेगीsed -r "/^\r$/d"
अलेक्जेंडर सेस्का

0

मेरा- bashविशिष्ट उत्तर इसके लिए perlवैश्विक पैटर्न gध्वज के साथ प्रतिस्थापन ऑपरेटर का उपयोग करने की सिफारिश करना है , इस प्रकार है:

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

यह उत्तर बताता है कि रिक्त रेखाओं में रिक्त स्थान हैं या नहीं ( [\ ]*), साथ ही साथ |कई खोज शब्दों / क्षेत्रों को अलग करने के लिए लेखांकन का चित्रण । MacOS हाई सिएरा और CentOS 6/7 पर परीक्षण किया गया।

FYI करें, ओपी का मूल कोड उच्च प्रदर्शन वाले सुपरकंप्यूटिंग क्लस्टर में macOS हाई सिएरा और CentOS 6/7 लिनक्स पर टर्मिनल sed '/^$/d' $fileमें ठीक काम करता है bash


-3

मेरे लिए FreeBSD 10.1 के साथ sed ने केवल इस समाधान का काम किया:

sed -e '/^[     ]*$/d' "testfile"

अंदर []अंतरिक्ष और टैब प्रतीक हैं।

परीक्षण फ़ाइल में शामिल हैं:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

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