क्या sed 'डबल' न्यूलाइन वर्ण हटा सकता है?


25

मेरे पास बहुत सारी खाली लाइनों वाला एक दस्तावेज है।

जब 2 या अधिक एक साथ हों तो मैं उन्हें कैसे निकाल सकता हूं।

मैंने sed "s/\n\n//"फ़ाइल की कोशिश की, लेकिन यह काम नहीं किया। कोई ग़लती नहीं।


3
क्या मैं आपको सही ढंग से पढ़ता हूं यदि आप सभी रिक्त लाइनों को नहीं निकालना चाहते हैं, लेकिन केवल अगर यह दो या अधिक है। तो सिंगल ब्लैंक लाइन्स नहीं?
रनियम

1
और अगर यह दो या दो से अधिक लाइनें हैं, तो क्या वास्तव में उन सभी को हटा दिया जाएगा या सिर्फ एक ही?
हौके लागिंग

जवाबों:


42

बस खाली लाइनों को हटाने के लिए:

sed  '/^$/d'

sedलाइन ओरिएंटेड है, इसलिए " बाइट एक नई रेखा को छोड़कर " किसी विशेष बाइट के 2 या अधिक के संदर्भ में सोचता है । फिर आपको कुछ सोचना होगा जो पूरी लाइन के लिए काम करता है।


बेशक! सरल लालित्य के लिए +1।
terdon

2
sedअपने "पैटर्न स्पेस" / "होल्ड स्पेस" फीचर के माध्यम से कई लाइनों को संभालने में सक्षम है। लेकिन मुझे लगता है कि यह बहुत जटिल है। ;-)
ड्यूक

यह वांछित कार्य नहीं करेगा यदि फ़ाइल का पहला वर्ण एक नई पंक्ति है।
क्रिस डाउन

1
यह काम करने के लिए जब पहला चरित्र एक नई 1!पंक्ति है (यदि यह वास्तव में एक आवश्यकता है), तो आप एक नकारात्मक पते के साथ कमांड को संलग्न कर सकते हैं (पंक्ति 1 को छोड़कर सभी से मेल खाते हैं), इस प्रकार sed '1!{/^$/d'}:।
टोबे स्पाइट

1
@AaronFranke - हाँ, लेकिन यह एक पहलू है कि कैसे लिनक्स गोले '>' पुनर्निर्देशन का इलाज करते हैं। शेल कमांड लाइन को देखता है, एक फ़ाइल में stdout का '>' पुनर्निर्देशन देखता है, वह फ़ाइल बनाता है, और उसके बाद ही चलता है sed। फ़ाइल बनाना अनिवार्य रूप से किसी भी मौजूदा फ़ाइल को उसी नाम से हटा देगा। sed '/^&/d' file.txt > otherfile.txtकाम करेगा।
ब्रूस एडगर

24

की कोई जरूरत नहीं sedgrepकरूँगा:

grep .

(यह है grep, SPC, dot, जो कि किसी भी लाइन से मेल खाता है जिसमें कम से कम एक वर्ण है)।

वहाँ भी:

tr -s '\n'

(एक में newline वर्णों के किसी भी क्रम को निचोड़ें)।

जैसा कि क्रिस ने उल्लेख किया है, दोनों समान नहीं हैं क्योंकि खाली रेखाओं को हटाना (जैसे पहले समाधान ऊपर और अधिकांश अन्य उत्तर यहां पर ध्यान केंद्रित करते हैं) नई लाइन वर्णों के अनुक्रमों को निचोड़ने के समान नहीं है, क्योंकि मामले में पहली पंक्ति खाली है। पहली पंक्ति को खाली करने के लिए केवल एक अग्रणी न्यूलाइन वर्ण लेता है ।


2
यह वांछित नहीं होगा क्योंकि फ़ाइल का पहला चरित्र एक नई पंक्ति है
क्रिस डाउन

7

sedउस के लिए सबसे अच्छा उपकरण नहीं है, क्योंकि यह लाइन आधारित है और \nअंत में लाइन चरित्र के रूप में व्यवहार करता है यह जटिल हो जाता है।देखा जा सकता है @ ब्रूस एडगर का जवाब sed अच्छी तरह से नौकरी के लिए सही उपकरण हो सकता है, फिर भी, यहां कुछ अन्य विकल्प हैं:

  1. पर्ल

    perl -ne 'print if /./' file.txt
    

    या

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

    धन्यवाद करने के लिए @ruakh जो मुझे जाना बना दिया है और पढ़ने के लिए इस :

    $ /

    इनपुट रिकॉर्ड सेपरेटर, डिफ़ॉल्ट रूप से नई लाइन। यह पर्ल के विचार को प्रभावित करता है कि "लाइन" क्या है। Awk का RS वैरिएबल की तरह काम करता है, जिसमें खाली रेखाओं को एक टर्मिनेटर के रूप में माना जाता है यदि नल स्ट्रिंग पर सेट किया जाता है (एक खाली लाइन में कोई रिक्त स्थान या टैब नहीं हो सकता है)। आप मल्टी-कैरेक्टर टर्मिनेटर से मेल करने के लिए इसे मल्टी-कैरेक्टर स्ट्रिंग में सेट कर सकते हैं, या फाइल के अंत में पढ़ने के लिए अपरिभाषित कर सकते हैं। इसे "\ n \ n" पर सेट करने का मतलब है कि "" सेटिंग से कुछ अलग है, अगर फाइल में लगातार खाली लाइनें हैं। "" पर सेट करना एक खाली रेखा के रूप में दो या दो से अधिक लगातार खाली लाइनों का इलाज करेगा। "\ N \ n" पर सेटिंग नेत्रहीन रूप से मान लेगा कि अगला इनपुट चरित्र अगले पैराग्राफ का है, भले ही यह एक नई पंक्ति हो।

  2. gawk / awk

    awk '$1' file.txt
    

    वह पोस्ट किए गए उदाहरण के लिए काम करेगा लेकिन @Stephane Chazelas ने बताया कि यह उन लाइनों को भी हटा देगा जिनका पहला क्षेत्र "जैसा दिखता है" है 0। यह अधिक मजबूत है:

    awk NF file.txt
    

पर्ल के लिए, perl -pe 's/\n+/\n/ file.txtकरेगा, इनपुट रिकॉर्ड विभाजक इस उपयोग के लिए अप्रासंगिक है।
वॉनब्रांड २ v

@vonbrand नहीं, perl -peया perl -neलाइन से काम लाइन। \n+कभी मेल नहीं खाएगा क्योंकि यह केवल एक ही लाइन पर लागू होता है। इसलिए आपको संपूर्ण फ़ाइल को ti slurp सेट करने $/या उपयोग करने की आवश्यकता है :। -0perl -0pe 's/\n+/\n/' file
terdon

6

हटाने का क्या मतलब है? डुप्लिकेट निकालें (एक से कई रिक्त लाइन) या सभी को निकालें?

यदि आप डुप्लिकेट को निकालना चाहते हैं, तो यहां sed का उपयोग करने की विधि है:

sed '$!N; /^\(.*\)\n\1$/!P; D'

यह uniqकमांड का अनुकरण करता है ।

सबसे अच्छा विकल्प का उपयोग कर रहा है awk:

awk NF <filename>

इस का sedहिस्सा महान काम करता है! यह सबसे अच्छा जवाब के रूप में एक की सिफारिश की।
Akito

2

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

ओपी वास्तव में व्याख्या करता है कि "यदि कोई दोहराई गई रिक्त लाइनें हैं तो फ़ाइल से सभी खाली लाइनें हटा दी जाती हैं"।

विशिष्ट उपयोगकर्ता "केवल डुप्लिकेट की गई रिक्त लाइनों को निकालना" चाहता है।

ऐसा करने के लिए, स्ट्रिपिंग व्हाइटपेस पहले, और पाइप हालांकि कैट-एस

sed  s/[[:space:]]*$// | cat -s

और फिर भी यह एक शानदार अग्रणी या अनुगामी रिक्त रेखा को नहीं हटाएगा।


नीच, लेकिन यह स्पष्ट रूप से काम करता है? कोई टिप्पणी नहीं ?
मैकेंज़्म

1
मैंने आपके लिए उत्थान किया ... आप जानते हैं ... प्रश्न का उत्तर दे रहे हैं। =) मुझे विश्वास नहीं हो रहा है कि जब ब्रूस एडगर की प्रतिक्रिया हर खाली लाइन को हटा देती है । अगर कोई पूछता है कि डुप्लिकेट की गई रिक्त लाइनों को कैसे हटाया जाए, तो मैं किसी भी परिदृश्य की कल्पना नहीं कर सकता, जहां सभी रिक्त लाइनों को हटाना एक स्वीकार्य समाधान होगा। जो कुछ भी लेकिन। सीड के लिए वेबसाइट पर एक पेज है जो इस तरह से कवर करता है: gnu.org/software/sed/manual/sed.html#cat-_002ds
टॉड वाल्टन

2

यदि आप रिक्त लाइनों के किसी भी अनुक्रम के लिए एक एकल रिक्त रेखा रखना चाहते हैं जो आप कर सकते हैं:

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'

1
यह एकमात्र उत्तर (इसके अलावा cat -s) है जो वास्तव में वही प्रश्न पूरा करता है जो मैंने इसे समझा था। (और यह बेहतर है cat -sक्योंकि मैं sed -iइसके साथ उपयोग कर सकता हूं ।)
मैथ्यू

-2

प्रयास करें sed -e 's#\\n\\n#\\n#g' input.file > output.fileका उपयोग कर /अपने क्षेत्र विभाजक और अपने regex के हिस्से के रूप में दोनों समस्या हो सकती है।


2
बस इसने मेरी एक फाइल को एक क्रम में डबल और ट्रिपल न्यूलाइन्स वाली एक चक्कर दिया। मेरे लिए बिल्कुल काम नहीं करता है।
वाक्य रचना

-3

इस कमांड का उपयोग करें:

tr -s '\r' '\n'

हां, उनका जवाब मेरे काम नहीं आया।
मेओना

5
AFAIK यह जवाब गलत है। मैं इसे हटाने के लिए यो की सलाह देता हूं।
झूझो

ओह, इसकी वजह से मेरी फ़ाइल में बहुत सारी नईलाइन और कैरेज़ रिटर्न हैं। 0x0d0a
meow

2
दरअसल, कमांड बार-बार लाइन के अंत वाली खिड़कियों के साथ लाइनों को हटाती है। के साथ टेस्ट करें echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'। आदेश trसभी \rको अनुवाद करेगा \nऔर फिर सभी \nको सिर्फ एक के लिए निचोड़ देगा । तो, यह काम करता है, यह सुनिश्चित नहीं है कि इस तथ्य के साथ क्या करना है कि यह विंडोज़ पर लागू होता है, यूनिक्स के लिए नहीं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.