यदि एक खाली रेखा दूसरे को छू रही है, तो उसे हटा दें, अन्यथा उसे छोड़ दें


0

इस के बारे में एक डुप्लिकेट है : इसी तरह के शब्द हैं जैसे कि https://unix.stackexchange.com/questions/76061/can-sed-remove-double-newline-characters या https: // stackoverflow-questions/27510462 / How-can-i-i-remove-double-line-break-with-sed - लोकप्रिय पहले पर, हालांकि मूल प्रश्न यकीनन मेरे जैसा ही है, इसका स्वीकृत और सबसे अपवित्र प्रश्न सभी खाली लाइनों को हटाता है, न कि केवल "जब वहाँ 2 या अधिक एक साथ हैं "जैसे सवाल पूछा गया। कुछ टिप्पणियों की शिकायत है कि उत्तर और अन्य लोग इस तरह से व्यवहार करते हैं, लेकिन कोई भी उत्तर एक भी खाली रेखा को छोड़ने के लिए नहीं दिया जाता है। कुछ अन्य उत्तर पूरी तरह से हटाने के बजाय एक खाली लाइन (निचोड़) में डुप्लिकेट खाली लाइनों को बदल देते हैं।


मैं वापस खाली लाइनों को हटाने के लिए एक स्क्रिप्ट करने योग्य तरीके की तलाश कर रहा हूं, लेकिन वहां खाली लाइनों को छोड़ दें।

मैं स्वचालित रूप से .srt(उपशीर्षक) फ़ाइलों को साफ करने के लिए देख रहा हूँ । इस प्रारूप में सबटाइटल सेक्शन (समय की किसी विशेष राशि पर प्रदर्शित करने के लिए) के बीच नई-नई पंक्तियों की आवश्यकता होती है। आमतौर पर, यदि 2 लाइनें एक बार में प्रदर्शित होनी हैं, तो उपशीर्षक लेखक में सिर्फ 2 लाइनें हैं। एक और शैली है जिसे कुछ लेखक प्रदर्शित करने के लिए लाइनों के बीच 2 खाली लाइनें रखने का उपयोग करते हैं। मेरे डिवाइस पर, यह केवल पहली पंक्ति को प्रदर्शित करने का प्रभाव है, और संभवतः टीवी से दूसरी पंक्ति को प्रस्तुत करना है।

इसलिए, मैं इसे बदलना चाहूंगा:

1
00:00:01,800 --> 00:00:03,802
    First line is here


    Second line is here

2
...

इस मामले में:

1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

ऐसा नहीं है कि इसे संभवतः अलग तरीके से संभालने की आवश्यकता है, लेकिन फ़ाइल प्रारूप में फ़ाइल के निचले भाग में एक खाली पंक्ति होनी चाहिए, जिसे वहां छोड़ दिया जाना चाहिए।

मैं चाहता हूं कि यह संभवत: पहले ट्रेलिंग व्हाट्सएप को हटाकर काम करे, फिर केवल उन सभी खाली लाइनों को हटा दे जो एक और खाली लाइन को छूती हैं। मैं नहीं चाहता कि इसे ए के बाकी फॉर्मेट के आधार पर एंकर किया जाए .srt, जैसे कि नंबर वाले सेक्शंस के बीच कितनी लाइनें हैं। (मैंने सोचा है कि सभी खाली लाइनों को हटाया जा सकता है, और केवल संख्यात्मक वर्णों वाली लाइनों पर वापस नई लाइनें जोड़ी जा सकती हैं, लेकिन मैं इसे वास्तविक .srtप्रारूप की अनदेखी करते हुए उससे अधिक सामान्य रखने की उम्मीद कर रहा हूं ।)

इसके अलावा, अगर किसी कारण .srtसे पाठ की 2 से अधिक लाइनें हैं, तो मैं चाहूंगा कि इसे इस तरह से छोड़ दिया जाए।

तो, शायद कुछ की तर्ज पर:

cat some.srt | sed 's/[ \t]*$//' | SOMETHING_ELSE

मैं एक पसंद करते हैं bash, sedया awkएक से अधिक समाधान perlएक। यदि मैं सही समझता हूं, तो मुझे लगता है कि बहु-स्तरीय होने के awkबजाय इसे लागू करना आसान होगा sed


अगर मैंने सही समझा, तो यह sedस्क्रिप्ट काम करेगी sed -r ':a;N;${:b;s/\n[[:blank:]]+\n/\n\n/;tb;s/\n{3,}/\n/g;s/\n+$/\n/};ba'
पाउलो

जवाबों:


0

यदि आपकी फ़ाइलों में समीपवर्ती लाइनें अद्वितीय हैं, और यह केवल निकटवर्ती रिक्त लाइनें हैं जिन्हें आप निकालना चाहते हैं, तो आप बस उपयोग कर सकते हैं uniq:

यूनीक - रिपोर्ट या दोहराया लाइनों को छोड़ दें

INPUT (या मानक इनपुट) से आसन्न मिलान लाइनों को फ़िल्टर करें, OUTPUT (या मानक आउटपुट) को लिख रहा है।

कोई विकल्प नहीं होने के कारण, मिलान रेखाएँ पहली घटना में विलीन हो जाती हैं।

रिटर्न के माध्यम से अपनी उदाहरण फ़ाइल चलाना:

$ uniq testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here

    Second line is here

2
...

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

दिलचस्प है, uniq -uआपके उदाहरण फ़ाइल पर (केवल अद्वितीय लाइनों को प्रिंट) का उपयोग करना आपके उदाहरण आउटपुट में परिणाम देता है (यह दो रिक्त लाइनों को हटाता है, पहले और दूसरे के बीच कोई भी नहीं छोड़ता है):

$ uniq -u testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

तुम मेरे शीर्षक के बारे में बिल्कुल सही हो। इसे फिर से देखते हुए, मुझे पता है कि मेरे शीर्षक से मेरा क्या मतलब है, लेकिन यह सबसे अच्छा है। "खाली लाइनों को वापस करने के लिए कई को हटा दें, एकल खाली लाइनों को छोड़ दें", मेरा मतलब था: "कई पीछे की खाली लाइनों के लिए, उन सभी को हटा दें; एकल खाली लाइनों के लिए किसी अन्य के साथ वापस नहीं आने के लिए, उन्हें छोड़ दें।" मैं शीर्षक संपादित करूँगा।
user1902689

मैं एक ऐसे समाधान की उम्मीद कर रहा हूं \n+, जो एक बहुस्तरीय रेगेक्स में वर्णित किया जा सकता है जो कि कुछ भी नहीं के साथ बदल रहा है , जो एक एकल \nजगह छोड़ देता है। लेकिन, olution जैसे अनुपस्थित, uniq -uशायद काम करना चाहिए। जब तक दो समान उपशीर्षक लाइनों को एक ही बार में प्रदर्शित किया जा रहा है जैसे दो अक्षर एक ही बात कह रहे हैं, तो इसे बहुत अच्छी तरह से काम करना चाहिए।
user1902689

यह हमेशा अच्छा होता है जब कोई कोरूटिल्स प्रोग्राम लगभग किसी भी regex या स्क्रिप्टिंग की आवश्यकता के बिना, अपने आप ही समस्या को हल कर देगा । आप पहले डुप्लिकेट लाइन के लिए एक फ़ाइल की जांच कर सकते हैं, जो कुछ भी रिक्त नहीं है, के लिए देख रहे हैं, केवल "डुप्लिकेट लाइनें प्रिंट uniqकरें -d, --repeated, प्रत्येक समूह के लिए एक" या -D"सभी डुप्लिकेट लाइनें प्रिंट करें"।
Xen2050
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.