मैं इस प्रश्न को देख रहा था और फिर सोच रहा था कि मैं अपने उत्तर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'