2012-09-26 10 views
18

मुझे ट्रिपल खाली लाइनों को हटाने के तरीके पर यह question and answer मिला। हालांकि, मुझे केवल दोहरी खाली लाइनों के लिए इसकी आवश्यकता है। अर्थात। सभी डबल रिक्त लाइनों को पूरी तरह हटा दिया जाना चाहिए, लेकिन एकल रिक्त लाइनों को रखा जाना चाहिए।केवल दो खाली खाली लाइनों को हटाने के लिए sed का उपयोग कैसे करें?

मैं sed का एक सा पता है, लेकिन ट्रिपल रिक्त लाइनों को हटाने के लिए प्रस्तावित आदेश मेरे सिर पर है:

sed '1N;N;/^\n\n$/d;P;D'

+2

ट्रिपल और अधिक खाली लाइनों के बारे में क्या? – xdazz

+0

@xdazz: हाँ यह ट्रिपल या अधिक रिक्त रेखाओं के लिए ठीक होगा। – marlar

उत्तर

10

मैं sed आदेश टिप्पणी की है कि आप समझ में नहीं आता:

sed ' 
    ## In first line: append second line with a newline character between them. 
    1N; 
    ## Do the same with third line. 
    N; 
    ## When found three consecutive blank lines, delete them. 
    ## Here there are two newlines but you have to count one more deleted with last "D" command. 
    /^\n\n$/d; 
    ## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends 
    ## a line from the other side. 
    P; 
    D 
' 

निकालें 1N क्योंकि हम 'ढेर' में केवल दो लाइनों की जरूरत है और यह दूसरी N साथ enought है, औरकरने के लिए /^\n\n$/d; बदल 10 लगातार दो रिक्त रेखाओं को हटाने के लिए।

एक परीक्षण:

infile की सामग्री:

1 


2 
3 

4 



5 

6 


7 

भागो sed आदेश:

sed ' 
    N; 
    /^\n$/d; 
    P; 
    D 
' infile 

कि पैदावार:

1 
2 
3 

4 

5 

6 
7 
+2

बहुत बहुत धन्यवाद, यह आदेश यह करता है: sed 'N;/^ \ n $/d; पी; डी' – marlar

+0

सभी इसका उपयोग करना चाहते हैं, 'sed -i' विकल्प को तुरंत बदलने के लिए मत भूलना आउट स्ट्रीम को परिणाम भेजने की बजाय फ़ाइल। – jan

4

यह ख होगा ई awk के साथ आसान:

awk -v RS='\n\n\n' 1 
4
sed '/^$/{N;/^\n$/d;}' 

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

आम तौर पर sed एक पंक्ति पढ़ेगा। N पैटर्न स्थान पर दूसरी पंक्ति जोड़ देगा। यदि वह रेखा खाली रेखा है। दोनों लाइनें नई लाइन से अलग हैं।

/^\n$/ यह पैटर्न उस समय से मेल खाता है केवल d काम करेगा। अन्य d काम नहीं करते हैं। d पैटर्न स्पेस को पूरी सामग्री को हटाने के लिए उपयोग किया जाता है, फिर अगला चक्र शुरू करें।

+0

मैंने इस कमांड को आजमाया है और यह अतिरिक्त न्यूलाइन को हटा देता है (कुछ नई न्यूलाइनों को एक नई लाइन द्वारा प्रतिस्थापित करने के बजाय पूरी तरह से हटा दिया जाता है)। मुझे सच में यकीन नहीं है कि ऐसा क्यों होता है, इसलिए सावधान रहें। – waldyrious

+0

sed 'एन;/^ \ n $/डी; पी; डी;' लगता है कि बेहतर काम करता है और केवल लगातार न्यूलाइन –

36

यह cat साथ आसान होगा:

cat -s 
+0

हटा देता है, लेकिन यह बिल्कुल वही नहीं करता है। हालांकि, मुझे यह विकल्प नहीं पता था और यह बहुत उपयोगी है, इसलिए वैसे भी धन्यवाद। – marlar

+2

इस बारे में कभी भी नहीं पता था, लेकिन मुझे वही था जो मुझे चाहिए था। अच्छा खोज –

+1

उन उत्सुक लोगों के लिए: http://explainshell.com/explain?cmd=cat+-s – waldyrious

-2

बस 'uniq' कमांड के लिए पाइप और यह सब खाली लाइनों परवाह किए बिना उन्हें की संख्या सिर्फ एक के लिए सिकुड़ गया हो जाएगा। सरल बेहतर है।

स्पष्टीकरण: जैसा कि मार्लर ने कहा है कि यह समाधान नहीं है यदि आपके पास "अन्य गैर-खाली लगातार डुप्लीकेट लाइनें" हैं जिन्हें आप छुटकारा नहीं चाहते हैं। यह अन्य मामलों में एक समाधान है जैसे कॉन्फ़िगरेशन फ़ाइलों को साफ़ करने का प्रयास करते समय, जो समाधान था जब मैंने यह प्रश्न देखा था। मैंने वास्तव में सिर्फ 'uniq' का उपयोग करके मेरी समस्या हल की।

+3

कभी-कभी यह बहुत आसान हो सकता है, हालांकि! यदि स्रोत में डुप्लिकेट प्रविष्टियां हैं तो उन्हें भी हटा दिया जाएगा। यह एक स्वीकार्य समाधान नहीं है। – marlar

संबंधित मुद्दे