sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
1 संपादित करें:
मैं यह समझा रहा हूँ, इस प्रकार ...
यह अनावश्यक रूप से जटिल है। मुझे पता नहीं था कि पते की सीमाओं के भीतर अनुमति है {}। इसलिए मुझे "खाली लाइनों को अलग" व्यक्त करना पड़ा। कोर कमांड है, tजो सेड का तरीका है if ... then। Tआसान होता, लेकिन केवल GNU सेड के लिए उपलब्ध है। मैं आदमी पृष्ठ का हवाला देता हूं:
t लेबल: यदि /// ने अंतिम इनपुट लाइन को पढ़ने के बाद से एक सफल प्रतिस्थापन किया है और अंतिम टी या टी कमांड के बाद से, तो लेबल करने के लिए शाखा; यदि लेबल छोड़ा गया है, तो स्क्रिप्ट के अंत में शाखा।
मैं प्रसिद्ध sकमांड का दुरुपयोग करता हूं । यह कुछ भी प्रतिस्थापित नहीं करेगा, लेकिन केवल यह परीक्षण करेगा कि क्या लाइन खाली है। तो यह एक खाली लाइन की जगह एक खाली लाइन को बदल देता है (किसी भी चीज को रिप्लेसमेंट के रूप में इस्तेमाल कर सकता है क्योंकि लाइन वैसे भी डिलीट हो जाती है)।
यदि s"प्रतिस्थापन" किया है तो लाइन खाली है। उस स्थिति में आदेश dनिष्पादित किया जाएगा। अन्यथा कुछ नहीं करना है। जैसा कि tएक sकार्रवाई के मामले में नहीं कूदता है मुझे bस्क्रिप्ट के अंत में कूदने के लिए शाखा कमांड की आवश्यकता है । : labelशाखा लक्ष्य हैं। पहले की तरह gotoफिर अंधेरे युग में (जब सेड का आविष्कार हुआ ... ते-ही)।
एक और विकल्प sसभी गैर-खाली लाइनों को "प्रतिस्थापित" करना होगा , जिससे sअधिक जटिल लेकिन बाकी की कमान आसान हो जाएगी:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$"गैर-रिक्त रेखा" का \1अर्थ है और "पहले कोष्ठक की सामग्री"।