मैं ऐसा करने के दो तरीके सोच सकता हूं।
पहला तरीका यह है कि आप फ़ाइल के मालिक हैं, लेकिन फ़ाइल पूरी तरह से है।
लिखने की कमांड (: w!) के लिए बस अपने विस्मयादिबोधक चिह्न प्रत्यय का उपयोग अपनी खुद की READONLY फ़ाइल को अधिलेखित करने के लिए करें। यह निश्चित रूप से मानता है कि आपके पास वर्तमान फ़ोल्डर में लिखने और निष्पादित करने की अनुमति है।
:w!
vi को मूल READONLY फ़ाइल को अधिलेखित करने का कारण होगा।
दूसरा तरीका यह है कि कोई अन्य व्यक्ति फ़ाइल का मालिक है, और आप उस फ़ाइल में अपने परिवर्तनों को सहेजना चाहेंगे।
इसे पूरा करने का एक तरीका यह है कि मूल फ़ाइल में किए गए परिवर्तनों को vi के भीतर से एक एड स्क्रिप्ट के रूप में सहेजा जाए। यह एड स्क्रिप्ट बाद में vi से बाहर एड लाइन एडिटर के साथ मूल फ़ाइल (या अन्य समान फ़ाइलों) पर लागू हो सकती है।
वर्तमान स्क्रिप्ट को एक एड स्क्रिप्ट के रूप में सहेजने का एक तरीका मूल फ़ाइल नाम और एडिट किए गए vi बफर को मानक इनपुट के रूप में --ed कमांड लाइन स्विच के साथ मानक उपयोगिता के रूप में पारित करना है। एक एड स्क्रिप्ट के रूप में अंतर प्रदर्शित करता है।
तो, एक संपादित vi बफर मान, तो निम्नलिखित प्रदर्शन करते हैं
:.,$!diff --ed [original_file] -
यह वर्तमान बफ़र में सभी पंक्तियों को बदलता है (!, $!), अलग-अलग जेनरेट की गई स्क्रिप्ट (diff --ed [original_file] -) के साथ मूल फ़ाइल को वर्तमान बफ़र की सामग्री में बदलने के लिए आवश्यक है। हम तब इस एड स्क्रिप्ट को सुरक्षित स्थान पर सहेजना चाहते हैं, और स्क्रिप्ट को उस मूल फ़ाइल के संस्करण में लागू कर सकते हैं जिसे हम लिख सकते हैं। इसलिए, स्क्रिप्ट को एक लिखित स्थान पर सहेजें, उदाहरण के लिए, आपका लॉगिन फ़ोल्डर:
:w ~/my_ed_script
अब vi से बाहर निकलें, और संपादित किए गए फ़ाइल को प्राप्त करने के लिए इस एड स्क्रिप्ट का उपयोग करें जिसे पहली बार में सहेजा नहीं जा सका। यहाँ है कि कैसे कमांड लाइन प्रॉम्प्ट से '' $ 'को पूरा करना है:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
इस कमांड सीक्वेंस को शब्दों में अलग-अलग करने के लिए हमने जो स्क्रिप्ट बनाई है, उसे अलग करना है और एड लिखने के कमांड, 'w' को एड के स्टैंडर्ड इनपुट तक पहुँचाना है। एड फिर इस स्क्रिप्ट को मूल फ़ाइल की लिखने योग्य कॉपी पर लागू करता है, और उन संशोधित बफर को वापस फाइल में बदल देता है।
तो यह vi में किए गए काम को बचाने के लिए एक फ़ाइल है जो मूल रूप से vi, diff, और ed का उपयोग करके किसी और के स्वामित्व में थी।