मेरे पास बहुत सारी खाली लाइनों वाला एक दस्तावेज है।
जब 2 या अधिक एक साथ हों तो मैं उन्हें कैसे निकाल सकता हूं।
मैंने sed "s/\n\n//"फ़ाइल की कोशिश की, लेकिन यह काम नहीं किया। कोई ग़लती नहीं।
मेरे पास बहुत सारी खाली लाइनों वाला एक दस्तावेज है।
जब 2 या अधिक एक साथ हों तो मैं उन्हें कैसे निकाल सकता हूं।
मैंने sed "s/\n\n//"फ़ाइल की कोशिश की, लेकिन यह काम नहीं किया। कोई ग़लती नहीं।
जवाबों:
बस खाली लाइनों को हटाने के लिए:
sed '/^$/d'
sedलाइन ओरिएंटेड है, इसलिए " बाइट एक नई रेखा को छोड़कर " किसी विशेष बाइट के 2 या अधिक के संदर्भ में सोचता है । फिर आपको कुछ सोचना होगा जो पूरी लाइन के लिए काम करता है।
sedअपने "पैटर्न स्पेस" / "होल्ड स्पेस" फीचर के माध्यम से कई लाइनों को संभालने में सक्षम है। लेकिन मुझे लगता है कि यह बहुत जटिल है। ;-)
1!पंक्ति है (यदि यह वास्तव में एक आवश्यकता है), तो आप एक नकारात्मक पते के साथ कमांड को संलग्न कर सकते हैं (पंक्ति 1 को छोड़कर सभी से मेल खाते हैं), इस प्रकार sed '1!{/^$/d'}:।
sed। फ़ाइल बनाना अनिवार्य रूप से किसी भी मौजूदा फ़ाइल को उसी नाम से हटा देगा। sed '/^&/d' file.txt > otherfile.txtकाम करेगा।
की कोई जरूरत नहीं sed। grepकरूँगा:
grep .
(यह है grep, SPC, dot, जो कि किसी भी लाइन से मेल खाता है जिसमें कम से कम एक वर्ण है)।
वहाँ भी:
tr -s '\n'
(एक में newline वर्णों के किसी भी क्रम को निचोड़ें)।
जैसा कि क्रिस ने उल्लेख किया है, दोनों समान नहीं हैं क्योंकि खाली रेखाओं को हटाना (जैसे पहले समाधान ऊपर और अधिकांश अन्य उत्तर यहां पर ध्यान केंद्रित करते हैं) नई लाइन वर्णों के अनुक्रमों को निचोड़ने के समान नहीं है, क्योंकि मामले में पहली पंक्ति खाली है। पहली पंक्ति को खाली करने के लिए केवल एक अग्रणी न्यूलाइन वर्ण लेता है ।
देखा जा सकता है @ ब्रूस एडगर का जवाब sedउस के लिए सबसे अच्छा उपकरण नहीं है, क्योंकि यह लाइन आधारित है और \nअंत में लाइन चरित्र के रूप में व्यवहार करता है यह जटिल हो जाता है।sed अच्छी तरह से नौकरी के लिए सही उपकरण हो सकता है, फिर भी, यहां कुछ अन्य विकल्प हैं:
पर्ल
perl -ne 'print if /./' file.txt
या
perl -pe '$/=""; s/\n+/\n/;' file.txt
धन्यवाद करने के लिए @ruakh जो मुझे जाना बना दिया है और पढ़ने के लिए इस :
$ /
इनपुट रिकॉर्ड सेपरेटर, डिफ़ॉल्ट रूप से नई लाइन। यह पर्ल के विचार को प्रभावित करता है कि "लाइन" क्या है। Awk का RS वैरिएबल की तरह काम करता है, जिसमें खाली रेखाओं को एक टर्मिनेटर के रूप में माना जाता है यदि नल स्ट्रिंग पर सेट किया जाता है (एक खाली लाइन में कोई रिक्त स्थान या टैब नहीं हो सकता है)। आप मल्टी-कैरेक्टर टर्मिनेटर से मेल करने के लिए इसे मल्टी-कैरेक्टर स्ट्रिंग में सेट कर सकते हैं, या फाइल के अंत में पढ़ने के लिए अपरिभाषित कर सकते हैं। इसे "\ n \ n" पर सेट करने का मतलब है कि "" सेटिंग से कुछ अलग है, अगर फाइल में लगातार खाली लाइनें हैं। "" पर सेट करना एक खाली रेखा के रूप में दो या दो से अधिक लगातार खाली लाइनों का इलाज करेगा। "\ N \ n" पर सेटिंग नेत्रहीन रूप से मान लेगा कि अगला इनपुट चरित्र अगले पैराग्राफ का है, भले ही यह एक नई पंक्ति हो।
gawk / awk
awk '$1' file.txt
वह पोस्ट किए गए उदाहरण के लिए काम करेगा लेकिन @Stephane Chazelas ने बताया कि यह उन लाइनों को भी हटा देगा जिनका पहला क्षेत्र "जैसा दिखता है" है 0। यह अधिक मजबूत है:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txtकरेगा, इनपुट रिकॉर्ड विभाजक इस उपयोग के लिए अप्रासंगिक है।
perl -peया perl -neलाइन से काम लाइन। \n+कभी मेल नहीं खाएगा क्योंकि यह केवल एक ही लाइन पर लागू होता है। इसलिए आपको संपूर्ण फ़ाइल को ti slurp सेट करने $/या उपयोग करने की आवश्यकता है :। -0perl -0pe 's/\n+/\n/' file
हटाने का क्या मतलब है? डुप्लिकेट निकालें (एक से कई रिक्त लाइन) या सभी को निकालें?
यदि आप डुप्लिकेट को निकालना चाहते हैं, तो यहां sed का उपयोग करने की विधि है:
sed '$!N; /^\(.*\)\n\1$/!P; D'
यह uniqकमांड का अनुकरण करता है ।
सबसे अच्छा विकल्प का उपयोग कर रहा है awk:
awk NF <filename>
sedहिस्सा महान काम करता है! यह सबसे अच्छा जवाब के रूप में एक की सिफारिश की।
इन उत्तरों में से अधिकांश के लिए, पहले व्हाट्सएप को पीछे हटाना आवश्यक है। दोहराए गए नए समाचारों को हटाने से सभी रिक्त लाइनें निकल जाती हैं। (इसके बारे में सोचें)।
ओपी वास्तव में व्याख्या करता है कि "यदि कोई दोहराई गई रिक्त लाइनें हैं तो फ़ाइल से सभी खाली लाइनें हटा दी जाती हैं"।
विशिष्ट उपयोगकर्ता "केवल डुप्लिकेट की गई रिक्त लाइनों को निकालना" चाहता है।
ऐसा करने के लिए, स्ट्रिपिंग व्हाइटपेस पहले, और पाइप हालांकि कैट-एस
sed s/[[:space:]]*$// | cat -s
और फिर भी यह एक शानदार अग्रणी या अनुगामी रिक्त रेखा को नहीं हटाएगा।
यदि आप रिक्त लाइनों के किसी भी अनुक्रम के लिए एक एकल रिक्त रेखा रखना चाहते हैं जो आप कर सकते हैं:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s) है जो वास्तव में वही प्रश्न पूरा करता है जो मैंने इसे समझा था। (और यह बेहतर है cat -sक्योंकि मैं sed -iइसके साथ उपयोग कर सकता हूं ।)
प्रयास करें sed -e 's#\\n\\n#\\n#g' input.file > output.fileका उपयोग कर /अपने क्षेत्र विभाजक और अपने regex के हिस्से के रूप में दोनों समस्या हो सकती है।
इस कमांड का उपयोग करें:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'। आदेश trसभी \rको अनुवाद करेगा \nऔर फिर सभी \nको सिर्फ एक के लिए निचोड़ देगा । तो, यह काम करता है, यह सुनिश्चित नहीं है कि इस तथ्य के साथ क्या करना है कि यह विंडोज़ पर लागू होता है, यूनिक्स के लिए नहीं।