मैं इस प्रश्न को देख रहा था और फिर सोच रहा था कि मैं अपने उत्तरsed को कैसे लागू कर सकता हूं जो विशुद्ध रूप से POSIX
exका उपयोग
करता है
।
चाल यह है कि जब तक sedमैं पकड़ स्थान की तुलना पैटर्न स्पेस के साथ कर सकता हूं यह देखने के लिए कि क्या वे बिल्कुल बराबर (साथ
G;/^\(.*\)\n\1$/{do something}) हैं, मुझे इस तरह के परीक्षण करने का कोई तरीका नहीं पता है ex।
मैं जानता हूँ कि विम में मैं कर सकता है कि Yपहली पंक्ति ANK और फिर टाइप
:2,$g/<C-r>0/dकरने के लिए लगभग मैं क्या निर्दिष्ट करने-लेकिन कर रहा हूँ कर पहली पंक्ति कुछ भी होता है, लेकिन बहुत स्पष्ट अल्फ़ान्यूमेरिक पाठ इस के बाद से लाइन एक के रूप में में फेंक दिया जा रहा है वास्तव में सुखद हो जाता है, अगर
regex , तुलना के लिए सिर्फ एक तार नहीं। (और यदि पहली पंक्ति में एक आगे की स्लैश है, तो शेष पंक्ति को एक कमांड के रूप में समझा जाएगा!)
इसलिए यदि मैं myfileउस सभी लाइनों को हटाना चाहता हूं जो पहली पंक्ति के समान हैं - लेकिन पहली पंक्ति को हटाना नहीं है - तो मैं उस उपयोग को कैसे कर सकता हूं ex? उस मामले के लिए, मैं इसका उपयोग कैसे कर सकता हूं vi?
क्या किसी पंक्ति को हटाने के लिए POSIX तरीका है यदि यह बिल्कुल दूसरी पंक्ति से मेल खाता है?
शायद इस काल्पनिक वाक्य रचना की तरह कुछ:
:2,$g/**lines equal to "0**/d
sedएक फिल्टर के रूप में उपयोग करना है ex, और sedपूरे बफर पर अपना पूरा उत्तर चलाना है ... जो काम करेगा , निश्चित रूप से (और वास्तव में इसके विपरीत पोर्टेबल है sed -i)।
<C-r>0बहुत अच्छा लगा। मुझे यकीन नहीं है कि आप केवल एक्स कमांड के साथ बेहतर कर सकते हैं क्योंकि आपको विशेष पात्रों की रक्षा करनी है। POSIX आज्ञाकारी बाधा के बिना मुझे लगता है कि आप बहुत ही नाममात्र स्विच का उपयोग करेंगे \Vऔर फिर आप बैकस्लैश की रक्षा करेंगे (क्योंकि यह अपने विशेष अर्थ को भी साथ रखता है \V) escape()फ़ंक्शन के साथ जिसका 2 तर्क एक स्ट्रिंग है जिसमें आप सभी पात्रों से बचना चाहते हैं / रक्षा करना चाहते हैं ।
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'या आप एक अर्धविराम की तरह पैटर्न परिसीमन के लिए किसी अन्य चरित्र का उपयोग कर सकते हैं। इस मामले में आपको पैटर्न में फ़ॉरवर्ड स्लैश की रक्षा करने की आवश्यकता नहीं होगी। यह कुछ इस तरह देगा::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sedभी बहुत अच्छा लगा। विम के साथ, आप अक्सर अन्य कार्यक्रमों के लिए कुछ विशेष कार्य सौंपते हैं, और sedशायद इसका एक अच्छा उदाहरण है। वैसे, आपको sedअपने पूरे बफ़र पर नहीं चलना है । यदि आप इसे केवल बफर के एक हिस्से पर चलाना चाहते हैं, तो आप एक सीमा दे सकते हैं। उदाहरण के लिए, यदि आप केवल 50 और 100 के बीच की लाइनों को फ़िल्टर करना चाहते हैं, तो आप टाइप कर सकते हैं :50,100!<your sed command>:।
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'